Importa código existente do SGMP_PROD

This commit is contained in:
Felipe Araujo 2026-03-09 15:46:01 -03:00
commit e34e85f382
60 changed files with 10122 additions and 0 deletions

56
.dockerignore Normal file
View File

@ -0,0 +1,56 @@
# Python
__pycache__/
*.py[cod]
*$py.class
*.so
.Python
venv/
env/
ENV/
*.egg-info/
dist/
build/
# Django
*.log
local_settings.py
db.sqlite3
db.sqlite3-journal
# Media files (serão montados como volume)
mediafiles/
# Static files (serão coletados no container)
staticfiles/
# IDE
.vscode/
.idea/
*.swp
*.swo
*~
# Git
.git/
.gitignore
# Docker
Dockerfile
docker-compose.yaml
.dockerignore
# Documentação
*.md
README*
# Testes
.pytest_cache/
.coverage
htmlcov/
# Outros
*.txt
!requirements.txt
test_results.json
colaboradores_rm.txt

54
.gitignore vendored Normal file
View File

@ -0,0 +1,54 @@
# === Python / Django básicos ===
__pycache__/
*.py[cod]
*$py.class
# Ambientes virtuais
.venv/
venv/
env/
ENV/
# Arquivos de log
*.log
*.tmp
# Banco de dados local (SQLite)
db.sqlite3
# Cache / testes
.pytest_cache/
.coverage
htmlcov/
.tox/
.mypy_cache/
.dmypy.json
# Arquivos de configuração sensíveis
*.env
.env.*
.envrc
# === Django estático / mídia (gerados em runtime) ===
staticfiles/
mediafiles/
# Arquivos de migração gerados pelo Django NÃO devem ser ignorados
# (migrations/** é intencionalmente mantido versionado)
# === Docker / Compose ===
docker-compose.override.yml
*.pid
# === Ferramentas / IDE ===
.vscode/
.idea/
*.iml
# Arquivos do macOS / sistema
.DS_Store
Thumbs.db
# === Ferramentas auxiliares do projeto ===
# Resultados de testes exportados
test_results.json

303
ARQUITETURA_APROVACAO.md Normal file
View File

@ -0,0 +1,303 @@
# Arquitetura de Aprovação - SGMP_PROD
## 📋 Situação Atual
### Fluxo de Aprovação Atual
```
GESTOR cria solicitação
Status: RASCUNHO
GESTOR envia para aprovação
Status: ENVIADA
GG analisa e APROVA/REPROVA
Se aprovada → Status: APROVADA_GG
CONTROLADORIA analisa e APROVA/REPROVA
Se aprovada → Status: APROVADA_CONTROLADORIA
DIRETORIA analisa e APROVA/REPROVA
Se aprovada → Status: FINALIZADA
Se reprovada → Status: REPROVADA
```
### Componentes Atuais
#### 1. Modelos (`models.py`)
- **`Solicitacao`**: Entidade central
- Método `etapa_atual()`: Retorna a etapa atual baseada no status
- Método `pode_aprovar(usuario)`: Verifica se o perfil do usuário corresponde à etapa atual
- **`Aprovacao`**: Registra cada decisão (aprovar/reprovar) em cada etapa
- Campos: `solicitacao`, `etapa`, `decisao`, `usuario`, `justificativa`, `decidido_em`
- Unique constraint: `(solicitacao, etapa)` - garante uma aprovação por etapa
- **`StatusSolicitacao`**: Enum com os status possíveis
- `RASCUNHO`, `ENVIADA`, `APROVADA_GG`, `APROVADA_CONTROLADORIA`, `APROVADA_DIRETORIA`, `FINALIZADA`, `REPROVADA`
- **`EtapaAprovacao`**: Enum com as etapas
- `GG`, `CONTROLADORIA`, `DIRETORIA`
#### 2. Services (`services.py`)
- **`aprovar_reprovar_solicitacao()`**: Função principal que:
1. Valida se a solicitação está em uma etapa válida
2. Valida se o perfil do usuário corresponde à etapa atual
3. Cria registro de `Aprovacao`
4. Atualiza o status da solicitação conforme a decisão
5. Se reprovado, finaliza a solicitação
6. Se aprovado, avança para o próximo status
#### 3. Views (`views.py`)
- **`decidir_solicitacao()`**: View que recebe POST com decisão e justificativa
- Decorator: `@requer_perfil(GG, CONTROLADORIA, DIRETORIA)`
- Chama `aprovar_reprovar_solicitacao()`
- **`solicitacao_detalhe()`**: Exibe detalhes e botões de aprovação
- Calcula `pode_aprovar` usando `solicitacao.pode_aprovar(usuario)`
- **`dashboard_view()`**: Lista solicitações com informações de `pode_aprovar`
#### 4. Templates
- **`dashboard.html`**: Mostra botões "Aprovar" e "Reprovar" se `item.pode_aprovar == True`
- **`solicitacao_detalhe.html`**: Similar, mostra botões de aprovação
---
## 🔄 Nova Arquitetura Proposta
### Novo Fluxo
```
GESTOR cria solicitação
Status: RASCUNHO
GESTOR envia para aprovação
Status: ENVIADA
GG registra PARECER (não aprova/reprova)
CONTROLADORIA registra PARECER (não aprova/reprova)
Status: AGUARDANDO_DIRETORIA (novo status)
DIRETORIA analisa pareceres e APROVA/REPROVA
Se aprovada → Status: FINALIZADA
Se reprovada → Status: REPROVADA
```
### Mudanças Necessárias
#### 1. Novo Modelo: `Parecer`
```python
class Parecer(BaseModel):
"""
Representa um parecer técnico emitido por GG ou CONTROLADORIA
sobre uma solicitação. Diferente de Aprovacao, um Parecer não
altera o status da solicitação, apenas fornece análise e dados.
"""
solicitacao = models.ForeignKey(Solicitacao, on_delete=models.CASCADE, related_name="pareceres")
etapa = models.CharField(max_length=20, choices=EtapaAprovacao.choices) # GG ou CONTROLADORIA
usuario = models.ForeignKey(UsuarioSistema, on_delete=models.PROTECT)
texto = models.TextField(help_text="Análise, dados e considerações sobre a solicitação")
criado_em = models.DateTimeField(auto_now_add=True)
class Meta:
unique_together = ("solicitacao", "etapa") # Um parecer por etapa
```
#### 2. Modificar `StatusSolicitacao`
Adicionar novo status:
- `AGUARDANDO_DIRETORIA = "AGUARDANDO_DIRETORIA", _("Aguardando Diretoria")`
#### 3. Modificar `Solicitacao.etapa_atual()`
```python
def etapa_atual(self):
mapa = {
StatusSolicitacao.ENVIADA: None, # GG e CONTROLADORIA podem dar parecer
StatusSolicitacao.AGUARDANDO_DIRETORIA: EtapaAprovacao.DIRETORIA,
}
return mapa.get(self.status)
```
#### 4. Modificar `Solicitacao.pode_aprovar()`
```python
def pode_aprovar(self, usuario=None):
"""
Apenas DIRETORIA pode aprovar/reprovar.
GG e CONTROLADORIA apenas podem dar parecer.
"""
etapa_atual = self.etapa_atual()
if etapa_atual is None:
return False
# Apenas DIRETORIA pode aprovar
if etapa_atual != EtapaAprovacao.DIRETORIA:
return False
if usuario:
if usuario.perfil != UsuarioSistema.Perfil.DIRETORIA:
return False
return True
```
#### 5. Novo método: `Solicitacao.pode_dar_parecer()`
```python
def pode_dar_parecer(self, usuario):
"""
Verifica se o usuário pode dar parecer na solicitação.
GG e CONTROLADORIA podem dar parecer quando status é ENVIADA.
"""
if self.status != StatusSolicitacao.ENVIADA:
return False
# Verifica se já deu parecer
parecer_existente = self.pareceres.filter(etapa=usuario.perfil).exists()
if parecer_existente:
return False # Já deu parecer
# GG e CONTROLADORIA podem dar parecer
if usuario.perfil in [UsuarioSistema.Perfil.GG, UsuarioSistema.Perfil.CONTROLADORIA]:
return True
return False
```
#### 6. Novo Service: `registrar_parecer()`
```python
@transaction.atomic
def registrar_parecer(
solicitacao: Solicitacao,
usuario: UsuarioSistema,
texto: str
) -> Parecer:
"""
Registra um parecer de GG ou CONTROLADORIA.
Não altera o status da solicitação.
"""
if not solicitacao.pode_dar_parecer(usuario):
raise PermissaoError("Usuário não pode dar parecer nesta solicitação.")
# Mapeia perfil para etapa
mapa_perfil_etapa = {
UsuarioSistema.Perfil.GG: EtapaAprovacao.GG,
UsuarioSistema.Perfil.CONTROLADORIA: EtapaAprovacao.CONTROLADORIA,
}
etapa = mapa_perfil_etapa.get(usuario.perfil)
parecer = Parecer.objects.create(
solicitacao=solicitacao,
etapa=etapa,
usuario=usuario,
texto=texto
)
# Verifica se ambos os pareceres foram dados
parecer_gg = Parecer.objects.filter(solicitacao=solicitacao, etapa=EtapaAprovacao.GG).exists()
parecer_controladoria = Parecer.objects.filter(solicitacao=solicitacao, etapa=EtapaAprovacao.CONTROLADORIA).exists()
if parecer_gg and parecer_controladoria:
# Ambos os pareceres foram dados, muda status para AGUARDANDO_DIRETORIA
solicitacao.status = StatusSolicitacao.AGUARDANDO_DIRETORIA
solicitacao.save()
return parecer
```
#### 7. Modificar `aprovar_reprovar_solicitacao()`
Agora apenas DIRETORIA pode usar esta função:
```python
@transaction.atomic
def aprovar_reprovar_solicitacao(
solicitacao: Solicitacao,
aprovador: UsuarioSistema,
decisao: str,
justificativa: str = ""
) -> Solicitacao:
"""
Apenas DIRETORIA pode aprovar/reprovar.
A solicitação deve estar em AGUARDANDO_DIRETORIA.
"""
if aprovador.perfil != UsuarioSistema.Perfil.DIRETORIA:
raise PermissaoError("Apenas a Diretoria pode aprovar/reprovar solicitações.")
if solicitacao.status != StatusSolicitacao.AGUARDANDO_DIRETORIA:
raise ValidacaoError("A solicitação não está aguardando aprovação da Diretoria.")
# ... resto da lógica similar
```
#### 8. Nova View: `registrar_parecer_view()`
```python
@login_required
@requer_perfil(UsuarioSistema.Perfil.GG, UsuarioSistema.Perfil.CONTROLADORIA)
def registrar_parecer_view(request, solicitacao_id):
solicitacao = get_object_or_404(Solicitacao, id=solicitacao_id)
usuario = get_usuario_sistema(request)
if request.method == "POST":
texto = request.POST.get("texto", "").strip()
if not texto:
messages.error(request, "O parecer não pode estar vazio.")
else:
try:
services.registrar_parecer(solicitacao, usuario, texto)
messages.success(request, "Parecer registrado com sucesso.")
except Exception as e:
messages.error(request, str(e))
return redirect("solicitacoes:solicitacao_detalhe", solicitacao_id=solicitacao.id)
```
#### 9. Modificar Templates
- **Dashboard**: Mostrar botão "Dar Parecer" para GG/CONTROLADORIA quando `pode_dar_parecer == True`
- **Detalhes**: Mostrar campo de texto para parecer e botão "Registrar Parecer" para GG/CONTROLADORIA
- Mostrar pareceres já registrados na seção de auditoria
---
## 📊 Resumo das Mudanças
| Componente | Mudança |
|------------|---------|
| **Modelo** | Adicionar `Parecer` |
| **StatusSolicitacao** | Adicionar `AGUARDANDO_DIRETORIA` |
| **Solicitacao.etapa_atual()** | Retornar `None` para `ENVIADA`, `DIRETORIA` para `AGUARDANDO_DIRETORIA` |
| **Solicitacao.pode_aprovar()** | Apenas DIRETORIA pode aprovar |
| **Solicitacao** | Adicionar método `pode_dar_parecer()` |
| **Services** | Novo: `registrar_parecer()`, modificar `aprovar_reprovar_solicitacao()` |
| **Views** | Novo: `registrar_parecer_view()`, modificar `decidir_solicitacao()` |
| **Templates** | Mostrar campos de parecer para GG/CONTROLADORIA, botões de aprovação apenas para DIRETORIA |
---
## ✅ Benefícios da Nova Arquitetura
1. **Separação de responsabilidades**: GG e CONTROLADORIA fornecem análise, DIRETORIA decide
2. **Flexibilidade**: Pareceres podem ser editados (se necessário) sem afetar o fluxo
3. **Rastreabilidade**: Histórico completo de pareceres e decisão final
4. **Clareza**: Status `AGUARDANDO_DIRETORIA` deixa claro que está aguardando decisão final

54
Dockerfile Normal file
View File

@ -0,0 +1,54 @@
FROM python:3.9-slim-bookworm
WORKDIR /app
# 1. Dependências de sistema (Oracle exige libaio1)
# Adicionei 'libaio1' explicitamente pois é runtime dependency
RUN apt-get update && \
apt-get install -y --no-install-recommends \
libaio1 \
libaio-dev \
curl \
unzip \
gcc \
g++ \
unixodbc-dev && \
rm -rf /var/lib/apt/lists/*
# 2. Oracle Instant Client
# Usando versão 21.13 (Link atualizado e funcional)
RUN mkdir -p /opt/oracle && \
cd /opt/oracle && \
curl -f -L -o instantclient.zip \
https://download.oracle.com/otn_software/linux/instantclient/2113000/instantclient-basic-linux.x64-21.13.0.0.0dbru.zip && \
unzip instantclient.zip && \
rm instantclient.zip && \
# O zip extrai para a pasta instantclient_21_13, ajustamos a config:
echo "/opt/oracle/instantclient_21_13" > /etc/ld.so.conf.d/oracle-instantclient.conf && \
ldconfig
# 3. Variáveis de Ambiente
ENV LD_LIBRARY_PATH=/opt/oracle/instantclient_21_13:$LD_LIBRARY_PATH
ENV ORACLE_LIB_DIR=/opt/oracle/instantclient_21_13
# 4. Instalação de pacotes Python
COPY requirements.txt .
RUN pip install --no-cache-dir --upgrade pip && \
pip install --no-cache-dir -r requirements.txt && \
pip install --no-cache-dir gunicorn
# 5. Copia o código
COPY . .
# 6. Tornar o entrypoint executável
COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
EXPOSE 8000
# Entrypoint que executa migrações e collectstatic antes de iniciar
ENTRYPOINT ["/entrypoint.sh"]
# Comando padrão
CMD ["gunicorn", "config.wsgi:application", "--bind", "0.0.0.0:8000", "--workers", "3", "--timeout", "120"]

321
README_PERMISSOES.md Normal file
View File

@ -0,0 +1,321 @@
# 🔐 Sistema de Login, Senhas e Permissões - SGMP
Este documento explica como funciona o sistema de autenticação e controle de permissões do SGMP.
---
## 📋 Índice
1. [Sistema de Login](#sistema-de-login)
2. [Criação de Usuários](#criação-de-usuários)
3. [Perfis e Permissões](#perfis-e-permissões)
4. [Gerenciamento de Permissões](#gerenciamento-de-permissões)
5. [Regras de Acesso](#regras-de-acesso)
6. [Fluxo de Aprovação](#fluxo-de-aprovação)
---
## 🔑 Sistema de Login
### Autenticação
O SGMP utiliza autenticação integrada com o sistema **Winthor** (TOTVS):
- **Login**: Matrícula do funcionário (mesma do sistema Winthor)
- **Senha**: Senha do sistema Winthor
- **Validação**: As credenciais são validadas diretamente no banco Oracle do Winthor
### Processo de Login
1. O usuário acessa a página de login
2. Informa sua **matrícula** e **senha**
3. O sistema consulta o Winthor para validar as credenciais
4. Se válido:
- Cria/atualiza o registro `UsuarioSistema` no banco do SGMP
- Cria uma sessão Django para o usuário
- Redireciona para o Dashboard
5. Se inválido:
- Exibe mensagem de erro
- Permanece na página de login
### Primeiro Acesso
Quando um usuário faz login pela primeira vez:
- Um registro `UsuarioSistema` é criado automaticamente
- O perfil padrão é **GESTOR**
- O usuário fica **ativo** por padrão
- O nome é obtido do Winthor
---
## 👥 Criação de Usuários
### Criação Automática
Os usuários são criados **automaticamente** no primeiro login:
- Não é necessário criar usuários manualmente
- O sistema sincroniza com o Winthor
- A matrícula é usada como identificador único
### Criação Manual (Admin Django)
Para criar usuários manualmente ou ajustar dados:
1. Acesse `/admin/` (painel administrativo do Django)
2. Navegue até **Solicitações → Usuários do Sistema**
3. Crie ou edite usuários conforme necessário
**Campos importantes:**
- **Matrícula**: Deve corresponder à matrícula do Winthor
- **Nome**: Nome completo do usuário
- **Perfil**: Define as permissões (veja seção de Perfis)
- **Ativo**: Se desmarcado, o usuário não consegue fazer login
---
## 🎭 Perfis e Permissões
O sistema possui **4 perfis** com diferentes níveis de acesso:
### 1. GESTOR (Gestor)
**Permissões:**
- ✅ Criar solicitações (desligamento, admissão, movimentação)
- ✅ Visualizar suas próprias solicitações
- ✅ Editar solicitações em status "Rascunho"
- ✅ Enviar solicitações para aprovação
- ✅ Gerenciar permissões de todos os usuários
- ❌ Não pode aprovar/reprovar solicitações
**Uso:** Gestores de equipe que iniciam processos de RH.
---
### 2. GG (Gente e Gestão)
**Permissões:**
- ✅ Visualizar solicitações com status "ENVIADA"
- ✅ Aprovar/reprovar solicitações na etapa GG
- ✅ Visualizar detalhes completos das solicitações
- ✅ Gerenciar permissões de todos os usuários
- ❌ Não pode criar novas solicitações
**Uso:** Primeira etapa de aprovação no fluxo.
---
### 3. CONTROLADORIA
**Permissões:**
- ✅ Visualizar solicitações aprovadas pela GG (status "APROVADA_GG")
- ✅ Aprovar/reprovar solicitações na etapa Controladoria
- ✅ Visualizar detalhes completos das solicitações
- ✅ Gerenciar permissões de todos os usuários
- ❌ Não pode criar novas solicitações
**Uso:** Segunda etapa de aprovação (análise financeira/orçamentária).
---
### 4. DIRETORIA
**Permissões:**
- ✅ Visualizar solicitações aprovadas pela Controladoria (status "APROVADA_CONTROLADORIA")
- ✅ Aprovar/reprovar solicitações na etapa Diretoria (aprovação final)
- ✅ Visualizar detalhes completos das solicitações
- ✅ Gerenciar permissões de todos os usuários
- ❌ Não pode criar novas solicitações
**Uso:** Aprovação final e decisão executiva.
---
## ⚙️ Gerenciamento de Permissões
### Acessando a Página de Permissões
1. Faça login no sistema
2. No menu lateral, clique em **"Administração"** (ícone ⚙️)
3. Você será redirecionado para a página de gerenciamento de permissões
### Funcionalidades
A página de permissões permite:
- **Visualizar todos os usuários** do sistema
- **Buscar usuários** por nome ou matrícula
- **Alterar o perfil** de qualquer usuário (incluindo o seu próprio)
- **Ver o status** (ativo/inativo) de cada usuário
- **Identificar seu próprio perfil** (marcado como "Você")
### Como Alterar um Perfil
1. Na tabela de usuários, localize o usuário desejado
2. Na coluna "Alterar Perfil", selecione o novo perfil no dropdown
3. Clique em **"Atualizar"**
4. Uma mensagem de confirmação será exibida
### Regras Importantes
- ✅ Qualquer usuário autenticado pode alterar permissões
- ✅ Você pode alterar seu próprio perfil
- ✅ Você pode alterar o perfil de outros usuários
- ⚠️ Alterar seu próprio perfil pode afetar suas permissões imediatamente
---
## 🔒 Regras de Acesso
### Dashboard
O dashboard exibe diferentes informações conforme o perfil:
#### GESTOR
- Vê apenas suas próprias solicitações
- Pode filtrar por status (Total, Pendentes, Aprovadas, Reprovadas)
- Vê solicitações em todos os status (incluindo "Rascunho")
#### GG, CONTROLADORIA, DIRETORIA
- Vê apenas solicitações pendentes na sua etapa
- Não vê solicitações em "Rascunho"
- Não vê solicitações já finalizadas ou reprovadas
### Criação de Solicitações
- **Apenas GESTOR** pode criar solicitações
- Outros perfis verão mensagem de erro se tentarem acessar formulários de criação
### Visualização de Detalhes
- Todos os perfis podem visualizar detalhes de solicitações
- O formulário de aprovação só aparece para perfis com permissão de aprovar
### Aprovação/Reprovação
- **GESTOR** não pode aprovar/reprovar suas próprias solicitações (após sair de "Rascunho")
- Cada perfil só pode aprovar na sua etapa específica do fluxo
- O solicitante não pode aprovar sua própria solicitação
---
## 📊 Fluxo de Aprovação
### Estados da Solicitação
1. **RASCUNHO**: Solicitação criada, ainda não enviada
2. **ENVIADA**: Enviada para aprovação (visível para GG)
3. **APROVADA_GG**: Aprovada pela GG (visível para Controladoria)
4. **APROVADA_CONTROLADORIA**: Aprovada pela Controladoria (visível para Diretoria)
5. **FINALIZADA**: Aprovada pela Diretoria (processo concluído)
6. **REPROVADA**: Reprovação em qualquer etapa (processo encerrado)
### Fluxo Completo
```
GESTOR cria solicitação
Status: RASCUNHO
GESTOR envia para aprovação
Status: ENVIADA
GG analisa e aprova/reprova
Se aprovada → Status: APROVADA_GG
CONTROLADORIA analisa e aprova/reprova
Se aprovada → Status: APROVADA_CONTROLADORIA
DIRETORIA analisa e aprova/reprova
Se aprovada → Status: FINALIZADA
```
### Regras de Aprovação
- Cada etapa só pode ser aprovada pelo perfil correspondente
- Uma reprovação em qualquer etapa encerra o processo
- O solicitante não pode aprovar sua própria solicitação
- Solicitações em "RascUNHO" só são visíveis para o criador
---
## 🛠️ Solução de Problemas
### Não consigo fazer login
**Possíveis causas:**
- Matrícula ou senha incorretas
- Usuário inativo no sistema
- Problema de conexão com o Winthor
**Solução:**
1. Verifique suas credenciais do Winthor
2. Acesse o admin Django (`/admin/`) e verifique se o usuário está ativo
3. Verifique a conexão com o banco Oracle
### Não vejo minhas solicitações
**Possíveis causas:**
- Perfil incorreto
- Solicitações em status "Rascunho" (só visíveis para o criador)
- Filtro aplicado no dashboard
**Solução:**
1. Verifique seu perfil na página de permissões
2. Se for GESTOR, certifique-se de que criou as solicitações
3. Limpe os filtros no dashboard
### Não consigo aprovar solicitações
**Possíveis causas:**
- Perfil sem permissão de aprovação
- Tentando aprovar sua própria solicitação
- Solicitação não está na sua etapa
**Solução:**
1. Verifique seu perfil (deve ser GG, CONTROLADORIA ou DIRETORIA)
2. Certifique-se de que não é o solicitante
3. Verifique se a solicitação está no status correto para sua etapa
### Não consigo criar solicitações
**Possíveis causas:**
- Perfil não é GESTOR
**Solução:**
1. Acesse a página de permissões
2. Altere seu perfil para GESTOR
3. Faça logout e login novamente
---
## 📝 Notas Importantes
1. **Senhas**: As senhas são gerenciadas pelo Winthor. O SGMP não armazena senhas.
2. **Sincronização**: O nome do usuário é sincronizado do Winthor no primeiro login.
3. **Perfil Padrão**: Novos usuários recebem automaticamente o perfil GESTOR.
4. **Ativação**: Usuários podem ser desativados no admin Django, impedindo login.
5. **Segurança**: Qualquer usuário autenticado pode gerenciar permissões. Considere restringir isso se necessário.
---
## 🔗 Links Úteis
- **Página de Login**: `/login/`
- **Dashboard**: `/solicitacoes/`
- **Gerenciar Permissões**: `/solicitacoes/permissoes/`
- **Admin Django**: `/admin/`
---
**Última atualização**: 2024

737
colaboradores_rm.txt Normal file
View File

@ -0,0 +1,737 @@
{'CODCOLIGADA': 3, 'CHAPA': '052561', 'NOME': 'ABRAHAO LINCON DA SILVA BARBOSA', 'CPF': '02919236237', 'SECAO': 'GENTE E GESTAO', 'FUNCAO': 'Estagiario Gente e Gestao', 'DATAADMISSAO': datetime.datetime(2025, 8, 11, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.009', 'CODFUNCAO': '000385', 'SALARIO': Decimal('600.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -351}
{'CODCOLIGADA': 1, 'CHAPA': '052058', 'NOME': 'ADAILSON SOUSA PADILHA', 'CPF': '04791987217', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Motorista Nivel I', 'DATAADMISSAO': datetime.datetime(2024, 9, 19, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '006.004.001', 'CODFUNCAO': '000161', 'SALARIO': Decimal('2163.23'), 'CODSINDICATO': '02', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 4565}
{'CODCOLIGADA': 1, 'CHAPA': '051855', 'NOME': 'ADALBERTO PEREIRA DE OLIVEIRA JUNIOR', 'CPF': '03930082233', 'SECAO': 'LOJA 4 OPERACIONAL', 'FUNCAO': 'Auxiliar de Reposição', 'DATAADMISSAO': datetime.datetime(2024, 2, 16, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '004.001.002', 'CODFUNCAO': '000327', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 7045}
{'CODCOLIGADA': 2, 'CHAPA': '051596', 'NOME': 'ADELICIO FERREIRA DE LIMA', 'CPF': '29427754249', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2023, 3, 13, 0, 0), 'CODSITUACAO': 'P', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 2, 'CHAPA': '044131', 'NOME': 'ADEMIR VASCONCELOS CORREA', 'CPF': '03209838208', 'SECAO': 'LOGISTICA OPERACIONAL BR', 'FUNCAO': 'Encarregado de Logistica Nivel I', 'DATAADMISSAO': datetime.datetime(2021, 3, 3, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.005', 'CODFUNCAO': '000259', 'SALARIO': Decimal('1930.60'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '051513', 'NOME': 'ADENILSON FERREIRA DA SILVA', 'CPF': '02437749233', 'SECAO': 'LOJA 5 OPERACIONAL', 'FUNCAO': 'Auxiliar de Estoque Nivel I', 'DATAADMISSAO': datetime.datetime(2022, 11, 11, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '005.001.002', 'CODFUNCAO': '000280', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 1297}
{'CODCOLIGADA': 3, 'CHAPA': '051928', 'NOME': 'ADILHA RAIANA BATISTA SANTOS', 'CPF': '70688159281', 'SECAO': 'LOJA 7 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas Nivel IV', 'DATAADMISSAO': datetime.datetime(2024, 5, 20, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.008', 'CODFUNCAO': '000294', 'SALARIO': Decimal('1838.66'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 6394}
{'CODCOLIGADA': 1, 'CHAPA': '052189', 'NOME': 'ADRIANO DA SILVA BARBOSA', 'CPF': '02566506248', 'SECAO': 'LOJA 9 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas Nivel VI', 'DATAADMISSAO': datetime.datetime(2024, 10, 7, 0, 0), 'CODSITUACAO': 'F', 'CODSECAO': '009.001.002', 'CODFUNCAO': '000313', 'SALARIO': Decimal('2043.00'), 'CODSINDICATO': '03', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 12083}
{'CODCOLIGADA': 2, 'CHAPA': '044989', 'NOME': 'ADRIANO FIGUEIREDO MACHADO', 'CPF': '97087718215', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2022, 9, 19, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 3, 'CHAPA': '052481', 'NOME': 'ADRIANO MOURA DE HOLANDA', 'CPF': '02516882246', 'SECAO': 'SEGURANCA PATRIMONIAL', 'FUNCAO': 'Fiscal de Loja', 'DATAADMISSAO': datetime.datetime(2025, 4, 17, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.003', 'CODFUNCAO': '000116', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 6697}
{'CODCOLIGADA': 1, 'CHAPA': '052603', 'NOME': 'ADRIEL VITOR DO ROSARIO CARDOSO', 'CPF': '05934564242', 'SECAO': 'LOJA 4 OPERACIONAL', 'FUNCAO': 'Auxiliar de Reposição', 'DATAADMISSAO': datetime.datetime(2025, 10, 25, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '004.001.002', 'CODFUNCAO': '000327', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 2597}
{'CODCOLIGADA': 2, 'CHAPA': '044908', 'NOME': 'AFONSO BRAGA DE SOUSA', 'CPF': '98565486249', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Assistente de Logistica Nivel IV', 'DATAADMISSAO': datetime.datetime(2021, 11, 25, 0, 0), 'CODSITUACAO': 'F', 'CODSECAO': '001.004.003', 'CODFUNCAO': '000257', 'SALARIO': Decimal('1838.66'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 3, 'CHAPA': '051852', 'NOME': 'AIDA MONTEIRO PORTAL', 'CPF': '00185769233', 'SECAO': 'SEGURANCA PATRIMONIAL', 'FUNCAO': 'Fiscal de loja Nivel VI', 'DATAADMISSAO': datetime.datetime(2024, 2, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.003', 'CODFUNCAO': '000318', 'SALARIO': Decimal('2043.00'), 'CODSINDICATO': '03', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -2224}
{'CODCOLIGADA': 2, 'CHAPA': '052403', 'NOME': 'AILSON DA SILVA BRITO', 'CPF': '91749760282', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2025, 2, 3, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 2, 'CHAPA': '051764', 'NOME': 'AILSON DA SILVA DA COSTA', 'CPF': '04614741231', 'SECAO': 'LOGISTICA ESTOQUE', 'FUNCAO': 'Assistente de Estoque IV', 'DATAADMISSAO': datetime.datetime(2023, 10, 20, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.003.013', 'CODFUNCAO': '000282', 'SALARIO': Decimal('1838.66'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 3320}
{'CODCOLIGADA': 1, 'CHAPA': '002627', 'NOME': 'AILTON CESAR BRITO REIS', 'CPF': '02565348100', 'SECAO': 'DIRETORIA', 'FUNCAO': 'Motorista Nivel I', 'DATAADMISSAO': datetime.datetime(2018, 3, 14, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '006.003.009', 'CODFUNCAO': '000161', 'SALARIO': Decimal('2163.23'), 'CODSINDICATO': '02', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -176640}
{'CODCOLIGADA': 1, 'CHAPA': '051654', 'NOME': 'ALAN AZEVEDO DOS SANTOS', 'CPF': '48325856220', 'SECAO': 'LOJA 3 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2023, 6, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '003.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 8471}
{'CODCOLIGADA': 1, 'CHAPA': '052558', 'NOME': 'ALAN DA SILVA PANTOJA', 'CPF': '02306366241', 'SECAO': 'LOJA 3 OPERACIONAL', 'FUNCAO': 'Auxiliar de Reposição', 'DATAADMISSAO': datetime.datetime(2025, 8, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '003.001.002', 'CODFUNCAO': '000327', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 2615}
{'CODCOLIGADA': 3, 'CHAPA': '051801', 'NOME': 'ALAN KENNALD VIANA DA SILVA', 'CPF': '00207328218', 'SECAO': 'SEGURANCA PATRIMONIAL', 'FUNCAO': 'Fiscal de Loja', 'DATAADMISSAO': datetime.datetime(2023, 12, 15, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.003', 'CODFUNCAO': '000116', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 1394}
{'CODCOLIGADA': 2, 'CHAPA': '044909', 'NOME': 'ALAN MARTINS DA SILVA', 'CPF': '91701910268', 'SECAO': 'SEGURANCA PATRIMONIAL', 'FUNCAO': 'Fiscal de Loja', 'DATAADMISSAO': datetime.datetime(2021, 11, 29, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.003.010', 'CODFUNCAO': '000116', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 3603}
{'CODCOLIGADA': 2, 'CHAPA': '052415', 'NOME': 'ALAN PATRIK PEREIRA DE OEIRAS', 'CPF': '86258036287', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2025, 2, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.003', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 2, 'CHAPA': '052158', 'NOME': 'ALAN ROBERTO MENDES CARDOSO', 'CPF': '03338295227', 'SECAO': 'LOGISTICA SUPPLY', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2024, 9, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.006', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -440}
{'CODCOLIGADA': 1, 'CHAPA': '052376', 'NOME': 'ALANA PEREIRA LOUREIRO', 'CPF': '08398217278', 'SECAO': 'LOJA 1 OPERACIONAL', 'FUNCAO': 'Operador de Caixa', 'DATAADMISSAO': datetime.datetime(2025, 2, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.002', 'CODFUNCAO': '000042', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -1605}
{'CODCOLIGADA': 1, 'CHAPA': '052525', 'NOME': 'ALDINEI DA COSTA RIBEIRO', 'CPF': '01187318230', 'SECAO': 'LOJA 10 LOGISTICA ', 'FUNCAO': 'Motorista Nivel I', 'DATAADMISSAO': datetime.datetime(2025, 5, 22, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '010.001.003', 'CODFUNCAO': '000161', 'SALARIO': Decimal('2163.23'), 'CODSINDICATO': '05', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -114}
{'CODCOLIGADA': 2, 'CHAPA': '004474', 'NOME': 'ALDO DA SILVA SANTOS', 'CPF': '45463654204', 'SECAO': 'LOGISTICA OPERACIONAL BR', 'FUNCAO': 'Operador de Empilhadeira Nivel III', 'DATAADMISSAO': datetime.datetime(2020, 7, 1, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.005', 'CODFUNCAO': '000056', 'SALARIO': Decimal('2165.24'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 2, 'CHAPA': '044932', 'NOME': 'ALEFY SERGIO MOREIRA REIS', 'CPF': '70415079209', 'SECAO': 'SEGURANCA PATRIMONIAL', 'FUNCAO': 'Fiscal de Loja', 'DATAADMISSAO': datetime.datetime(2022, 2, 1, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.003.010', 'CODFUNCAO': '000116', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -1661}
{'CODCOLIGADA': 2, 'CHAPA': '052612', 'NOME': 'ALEHANDRO ICARO CUNHA DA SILVA', 'CPF': '06805445264', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2025, 11, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.003', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 2, 'CHAPA': '052293', 'NOME': 'ALESSANDRO DA SILVA TEIXEIRA', 'CPF': '69292302272', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2024, 11, 18, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.003', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '051979', 'NOME': 'ALESSANDRO FERREIRA FERREIRA', 'CPF': '03336289262', 'SECAO': 'LOJA 5 OPERACIONAL', 'FUNCAO': 'Auxiliar de Reposição', 'DATAADMISSAO': datetime.datetime(2024, 6, 6, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '005.001.002', 'CODFUNCAO': '000327', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 6839}
{'CODCOLIGADA': 5, 'CHAPA': '019', 'NOME': 'ALESSANDRO GUIMARAES GONCALVES', 'CPF': '51674645287', 'SECAO': 'DTI', 'FUNCAO': 'Desenvolvedor de TI', 'DATAADMISSAO': datetime.datetime(2024, 12, 9, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '1.02', 'CODFUNCAO': '000400', 'SALARIO': Decimal('8500.00'), 'CODSINDICATO': '01', 'INICIOPER': None, 'FIMPER': None, 'SALDO_MINUTOS': None}
{'CODCOLIGADA': 2, 'CHAPA': '052563', 'NOME': 'ALESSANDRO MONTEIRO BARBOSA', 'CPF': '70938241290', 'SECAO': 'LOGISTICA SUPPLY', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2025, 8, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.006', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -440}
{'CODCOLIGADA': 2, 'CHAPA': '052333', 'NOME': 'ALESSANDRO PEREIRA CARVALHO', 'CPF': '52724832272', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Encarregado de Logistica Nivel IV', 'DATAADMISSAO': datetime.datetime(2024, 12, 16, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000415', 'SALARIO': Decimal('2454.50'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 2, 'CHAPA': '051795', 'NOME': 'ALEXANDRE ARAUJO DA CRUZ', 'CPF': '92749240204', 'SECAO': 'LOGISTICA OPERACIONAL BR', 'FUNCAO': 'Assistente de Logistica Nivel IV', 'DATAADMISSAO': datetime.datetime(2023, 12, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.005', 'CODFUNCAO': '000257', 'SALARIO': Decimal('1838.66'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 2, 'CHAPA': '052367', 'NOME': 'ALEXANDRO FERREIRA DE ASSIS', 'CPF': '69011702204', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Motoboy', 'DATAADMISSAO': datetime.datetime(2025, 1, 15, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000032', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '003918', 'NOME': 'ALFREDO DA CONCEICAO NETO', 'CPF': '02474537228', 'SECAO': 'LOJA 9 OPERACIONAL', 'FUNCAO': 'Gerente de Loja', 'DATAADMISSAO': datetime.datetime(2020, 3, 9, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '009.001.002', 'CODFUNCAO': '000208', 'SALARIO': Decimal('3814.46'), 'CODSINDICATO': '03', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 3, 'CHAPA': '051974', 'NOME': 'ALICE PINZ KLEMANN', 'CPF': '03069097235', 'SECAO': 'GENTE E GESTAO', 'FUNCAO': 'Estagiario Gente e Gestao', 'DATAADMISSAO': datetime.datetime(2024, 5, 22, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.009', 'CODFUNCAO': '000385', 'SALARIO': Decimal('600.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 380}
{'CODCOLIGADA': 2, 'CHAPA': '004459', 'NOME': 'ALINE SANTOS COSTA', 'CPF': '01034164201', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Coordenador de Logística', 'DATAADMISSAO': datetime.datetime(2020, 7, 1, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.003', 'CODFUNCAO': '000404', 'SALARIO': Decimal('3540.13'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '052375', 'NOME': 'ALISON MONTEIRO CUNHA', 'CPF': '05048873270', 'SECAO': 'LOJA 1 OPERACIONAL', 'FUNCAO': 'Operador de Caixa', 'DATAADMISSAO': datetime.datetime(2025, 2, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.002', 'CODFUNCAO': '000042', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 6915}
{'CODCOLIGADA': 2, 'CHAPA': '052093', 'NOME': 'ALLAN CRUZ COSTA', 'CPF': '54558000278', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Operador de Empilhadeira Nivel I', 'DATAADMISSAO': datetime.datetime(2024, 7, 15, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.003', 'CODFUNCAO': '000377', 'SALARIO': Decimal('2085.05'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 2, 'CHAPA': '052627', 'NOME': 'ALLAN DE LIMA CAMARA', 'CPF': '02551724279', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2026, 1, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 5, 'CHAPA': '011', 'NOME': 'ALMIR PANTOJA MEIRELES', 'CPF': '55243487287', 'SECAO': 'FINANCEIRO', 'FUNCAO': 'Supervisor financeiro nível VI', 'DATAADMISSAO': datetime.datetime(2024, 5, 1, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '1.03', 'CODFUNCAO': '000382', 'SALARIO': Decimal('4061.48'), 'CODSINDICATO': '01', 'INICIOPER': None, 'FIMPER': None, 'SALDO_MINUTOS': None}
{'CODCOLIGADA': 1, 'CHAPA': '051818', 'NOME': 'ALVARO DO ESPIRITO SANTO DAS DORES', 'CPF': '46106286272', 'SECAO': 'LOJA 4 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2024, 1, 1, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '004.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1926.49'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 5256}
{'CODCOLIGADA': 1, 'CHAPA': '052462', 'NOME': 'ALYSON BRUNO DE MELO SOUSA', 'CPF': '06025794227', 'SECAO': 'LOJA 9 OPERACIONAL', 'FUNCAO': 'Repositor de mercadorias Nivel VI', 'DATAADMISSAO': datetime.datetime(2025, 4, 4, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '009.001.002', 'CODFUNCAO': '000320', 'SALARIO': Decimal('2043.00'), 'CODSINDICATO': '03', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -582}
{'CODCOLIGADA': 2, 'CHAPA': '004476', 'NOME': 'AMADEU JUNIOR BRITO SERRAO', 'CPF': '64038025268', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Operador de Empilhadeira Nivel III', 'DATAADMISSAO': datetime.datetime(2020, 7, 1, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.003', 'CODFUNCAO': '000056', 'SALARIO': Decimal('2165.24'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '052550', 'NOME': 'AMANDA DA SILVA FIALHO', 'CPF': '05000708229', 'SECAO': 'LOJA 3 OPERACIONAL', 'FUNCAO': 'APRENDIZ', 'DATAADMISSAO': datetime.datetime(2025, 7, 16, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '003.001.002', 'CODFUNCAO': '000038', 'SALARIO': Decimal('761.55'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 524}
{'CODCOLIGADA': 1, 'CHAPA': '026103', 'NOME': 'ANA BEATRIZ ARAUJO DOS SANTOS', 'CPF': '07145884232', 'SECAO': 'DTI', 'FUNCAO': 'Analista Administrativo Nivel III', 'DATAADMISSAO': datetime.datetime(2021, 2, 3, 0, 0), 'CODSITUACAO': 'E', 'CODSECAO': '006.003.005', 'CODFUNCAO': '000406', 'SALARIO': Decimal('2251.85'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -664}
{'CODCOLIGADA': 1, 'CHAPA': '052220', 'NOME': 'ANA CRISTINA FEIO DE SOUSA', 'CPF': '96469846220', 'SECAO': 'LOJA 10 OPERACIONAL', 'FUNCAO': 'Servicos Gerais', 'DATAADMISSAO': datetime.datetime(2024, 10, 7, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '010.001.002', 'CODFUNCAO': '000059', 'SALARIO': Decimal('1780.00'), 'CODSINDICATO': '05', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 5893}
{'CODCOLIGADA': 2, 'CHAPA': '052208', 'NOME': 'ANAILSON PEREIRA CORREA', 'CPF': '04168190285', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2024, 10, 7, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '003916', 'NOME': 'ANDERSON DA SILVA MOREIRA', 'CPF': '03076187228', 'SECAO': 'LOJA 5 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2020, 3, 19, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '005.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 1549}
{'CODCOLIGADA': 2, 'CHAPA': '052619', 'NOME': 'ANDERSON DOS SANTOS RODRIGUES', 'CPF': '03860591282', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2025, 12, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.003', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '000574', 'NOME': 'ANDERSON JOSE BRASIL FEITOSA FERNANDES', 'CPF': '77725239200', 'SECAO': 'LOJA 9 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas Nivel VI', 'DATAADMISSAO': datetime.datetime(2021, 11, 24, 0, 0), 'CODSITUACAO': 'P', 'CODSECAO': '009.001.002', 'CODFUNCAO': '000313', 'SALARIO': Decimal('2043.00'), 'CODSINDICATO': '03', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 1134}
{'CODCOLIGADA': 2, 'CHAPA': '052248', 'NOME': 'ANDERSON LUIS COSTA RODRIGUES', 'CPF': '68994958215', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Operador de Empilhadeira Nivel I', 'DATAADMISSAO': datetime.datetime(2024, 10, 11, 0, 0), 'CODSITUACAO': 'F', 'CODSECAO': '001.004.003', 'CODFUNCAO': '000377', 'SALARIO': Decimal('2085.05'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 3, 'CHAPA': '003816', 'NOME': 'ANDERSON SILVA DA SILVA', 'CPF': '06395303201', 'SECAO': 'SEGURANCA PATRIMONIAL', 'FUNCAO': 'Fiscal de Loja', 'DATAADMISSAO': datetime.datetime(2022, 4, 19, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.003', 'CODFUNCAO': '000116', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -550}
{'CODCOLIGADA': 5, 'CHAPA': '018', 'NOME': 'ANDRE BARROSO DA COSTA', 'CPF': '63561450210', 'SECAO': 'DTI', 'FUNCAO': 'Gerente de TI', 'DATAADMISSAO': datetime.datetime(2024, 12, 2, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '1.02', 'CODFUNCAO': '000344', 'SALARIO': Decimal('10000.00'), 'CODSINDICATO': '01', 'INICIOPER': None, 'FIMPER': None, 'SALDO_MINUTOS': None}
{'CODCOLIGADA': 1, 'CHAPA': '003443', 'NOME': 'ANDRE DA SILVA BARBOSA', 'CPF': '74167570297', 'SECAO': 'LOJA 8 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2017, 11, 20, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '008.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 869}
{'CODCOLIGADA': 1, 'CHAPA': '051635', 'NOME': 'ANDRE FONSECA DOS SANTOS', 'CPF': '68801785291', 'SECAO': 'LOJA 5 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2023, 5, 9, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '005.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 3922}
{'CODCOLIGADA': 2, 'CHAPA': '051718', 'NOME': 'ANDRE ROGERIO DE OLIVEIRA FARIAS', 'CPF': '60273003291', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Assistente de Estoque IV', 'DATAADMISSAO': datetime.datetime(2023, 9, 18, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.003', 'CODFUNCAO': '000282', 'SALARIO': Decimal('1838.66'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '003345', 'NOME': 'ANDRECI SOARES SOARES', 'CPF': '94367787249', 'SECAO': 'LOJA 2 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2019, 1, 2, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '002.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 13484}
{'CODCOLIGADA': 2, 'CHAPA': '051884', 'NOME': 'ANDREI BRITO REIS', 'CPF': '03404114221', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Analista de logistica Nivel III', 'DATAADMISSAO': datetime.datetime(2024, 4, 15, 0, 0), 'CODSITUACAO': 'F', 'CODSECAO': '001.004.003', 'CODFUNCAO': '000254', 'SALARIO': Decimal('2251.85'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 4782}
{'CODCOLIGADA': 1, 'CHAPA': '052173', 'NOME': 'ANDREIA ALVES CARDOSO', 'CPF': '74293052291', 'SECAO': 'LOJA 10 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2024, 9, 19, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '010.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '05', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 9973}
{'CODCOLIGADA': 1, 'CHAPA': '003347', 'NOME': 'ANDREIA FIALHO NASCIMENTO', 'CPF': '01031771247', 'SECAO': 'LOJA 1 OPERACIONAL', 'FUNCAO': 'Gerente de Loja', 'DATAADMISSAO': datetime.datetime(2019, 6, 1, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.002', 'CODFUNCAO': '000208', 'SALARIO': Decimal('3729.18'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 2, 'CHAPA': '044906', 'NOME': 'ANDREW COSTA MONTEIRO', 'CPF': '05856834259', 'SECAO': 'LOGISTICA OPERACIONAL BR', 'FUNCAO': 'Analista de logistica Nivel III', 'DATAADMISSAO': datetime.datetime(2021, 11, 18, 0, 0), 'CODSITUACAO': 'F', 'CODSECAO': '001.004.005', 'CODFUNCAO': '000254', 'SALARIO': Decimal('2251.85'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '051857', 'NOME': 'ANDREY BRITO MELO', 'CPF': '00756712203', 'SECAO': 'LOJA 5 OPERACIONAL', 'FUNCAO': 'Auxiliar de Reposição', 'DATAADMISSAO': datetime.datetime(2024, 3, 1, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '005.001.002', 'CODFUNCAO': '000327', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 6052}
{'CODCOLIGADA': 2, 'CHAPA': '052487', 'NOME': 'ANDREY EDMUNDO DE SOUSA FERREIRA', 'CPF': '01877122203', 'SECAO': 'LOGISTICA SUPPLY', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2025, 5, 15, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.006', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -440}
{'CODCOLIGADA': 2, 'CHAPA': '052286', 'NOME': 'ANDREY YAGO FERREIRA RODRIGUES', 'CPF': '00723982210', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2024, 11, 18, 0, 0), 'CODSITUACAO': 'V', 'CODSECAO': '001.004.003', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 3, 'CHAPA': '051646', 'NOME': 'ANGELA DE LEMOS LIMA RODRIGUES', 'CPF': '04529436209', 'SECAO': 'FINANCEIRO', 'FUNCAO': 'Supervisor Financeiro Nivel V', 'DATAADMISSAO': datetime.datetime(2023, 5, 17, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.006', 'CODFUNCAO': '000398', 'SALARIO': Decimal('3692.25'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 2809}
{'CODCOLIGADA': 1, 'CHAPA': '052483', 'NOME': 'ANGELO MARCIO DE LIMA MARTINS', 'CPF': '60213612291', 'SECAO': 'LOJA 1 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2025, 4, 15, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 7105}
{'CODCOLIGADA': 3, 'CHAPA': '051811', 'NOME': 'ANNY CAROLYNI SANTOS DA SILVA', 'CPF': '04046377283', 'SECAO': 'CONTABILIDADE', 'FUNCAO': 'Assistente Administrativo I', 'DATAADMISSAO': datetime.datetime(2023, 12, 15, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.002', 'CODFUNCAO': '000370', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 2353}
{'CODCOLIGADA': 2, 'CHAPA': '052331', 'NOME': 'ANTONIEL HADAD BRAGA', 'CPF': '01099681235', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Motorista Nivel I', 'DATAADMISSAO': datetime.datetime(2024, 12, 16, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000161', 'SALARIO': Decimal('2163.23'), 'CODSINDICATO': '02', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 2, 'CHAPA': '044130', 'NOME': 'ANTONIO CARLOS DA COSTA MONTEIRO', 'CPF': '81126549215', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2021, 2, 22, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '052310', 'NOME': 'ANTONIO CARLOS DE MENDONCA NETO', 'CPF': '03127359284', 'SECAO': 'LOJA 9 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas Nivel VI', 'DATAADMISSAO': datetime.datetime(2024, 12, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '009.001.002', 'CODFUNCAO': '000313', 'SALARIO': Decimal('2043.00'), 'CODSINDICATO': '03', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 464}
{'CODCOLIGADA': 1, 'CHAPA': '051935', 'NOME': 'ANTONIO CARLOS DE SOUSA FERREIRA', 'CPF': '77774310215', 'SECAO': 'LOJA 10 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2024, 7, 1, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '010.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '05', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 11089}
{'CODCOLIGADA': 1, 'CHAPA': '005732', 'NOME': 'ANTONIO DEIVISON AZEVEDO LAMEIRA', 'CPF': '02334922242', 'SECAO': 'LOJA 9 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas Nivel VI', 'DATAADMISSAO': datetime.datetime(2022, 1, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '009.001.002', 'CODFUNCAO': '000313', 'SALARIO': Decimal('2043.00'), 'CODSINDICATO': '03', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 392}
{'CODCOLIGADA': 1, 'CHAPA': '052574', 'NOME': 'ANTONIO NELSON PENICHE FERREIRA', 'CPF': '08967437218', 'SECAO': 'LOJA 8 OPERACIONAL', 'FUNCAO': 'Auxiliar de Reposição', 'DATAADMISSAO': datetime.datetime(2025, 8, 20, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '008.001.002', 'CODFUNCAO': '000327', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 7}
{'CODCOLIGADA': 1, 'CHAPA': '052593', 'NOME': 'ANTONIO PAULO SOARES DE BRITO', 'CPF': '08613291988', 'SECAO': 'LOJA 2 OPERACIONAL', 'FUNCAO': 'APRENDIZ', 'DATAADMISSAO': datetime.datetime(2025, 10, 14, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '002.001.002', 'CODFUNCAO': '000038', 'SALARIO': Decimal('761.55'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 104}
{'CODCOLIGADA': 1, 'CHAPA': '003458', 'NOME': 'ARLIELSON VIANA FERREIRA', 'CPF': '02141928222', 'SECAO': 'LOJA 8 OPERACIONAL', 'FUNCAO': 'Auxiliar de Reposição', 'DATAADMISSAO': datetime.datetime(2021, 10, 19, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '008.001.002', 'CODFUNCAO': '000327', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 170}
{'CODCOLIGADA': 1, 'CHAPA': '051682', 'NOME': 'ARNALDO GARCIA FERREIRA', 'CPF': '29599628268', 'SECAO': 'LOJA 4 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2023, 8, 7, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '004.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 220}
{'CODCOLIGADA': 1, 'CHAPA': '003917', 'NOME': 'AROLDO JUNIOR REIS PAIVA', 'CPF': '01762824248', 'SECAO': 'LOJA 5 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2020, 3, 19, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '005.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 5314}
{'CODCOLIGADA': 2, 'CHAPA': '051722', 'NOME': 'ARTHUR CESAR TORRES', 'CPF': '01704225264', 'SECAO': 'LOGISTICA ESTOQUE', 'FUNCAO': 'Assistente de Estoque IV', 'DATAADMISSAO': datetime.datetime(2023, 9, 18, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.003.013', 'CODFUNCAO': '000282', 'SALARIO': Decimal('1838.66'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 9818}
{'CODCOLIGADA': 1, 'CHAPA': '052373', 'NOME': 'ARTHUR DA COSTA ALVES', 'CPF': '06022463262', 'SECAO': 'LOJA 4 OPERACIONAL', 'FUNCAO': 'APRENDIZ', 'DATAADMISSAO': datetime.datetime(2025, 1, 22, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '004.001.002', 'CODFUNCAO': '000038', 'SALARIO': Decimal('761.55'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 817}
{'CODCOLIGADA': 1, 'CHAPA': '052277', 'NOME': 'ARTHUR LOARNES RODRIGUES DA SILVA', 'CPF': '06038690255', 'SECAO': 'LOJA 9 OPERACIONAL', 'FUNCAO': 'Auxiliar de estoque Nivel V', 'DATAADMISSAO': datetime.datetime(2024, 11, 18, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '009.001.002', 'CODFUNCAO': '000321', 'SALARIO': Decimal('1851.00'), 'CODSINDICATO': '03', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 76}
{'CODCOLIGADA': 3, 'CHAPA': '052029', 'NOME': 'ARTHUR PINHEIRO DOS SANTOS', 'CPF': '00497356244', 'SECAO': 'LOGISTICA ESTOQUE', 'FUNCAO': 'Assistente de Estoque IV', 'DATAADMISSAO': datetime.datetime(2024, 6, 22, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.010', 'CODFUNCAO': '000282', 'SALARIO': Decimal('1838.66'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 2292}
{'CODCOLIGADA': 2, 'CHAPA': '052198', 'NOME': 'ARTUR SILVA MATOS', 'CPF': '02775960251', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2024, 10, 7, 0, 0), 'CODSITUACAO': 'V', 'CODSECAO': '001.004.003', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -323}
{'CODCOLIGADA': 1, 'CHAPA': '052165', 'NOME': 'AUGUSTO CEZAR CHERMONT BENTES', 'CPF': '04178885200', 'SECAO': 'LOJA 1 OPERACIONAL', 'FUNCAO': 'Auxiliar de Reposição', 'DATAADMISSAO': datetime.datetime(2024, 9, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.002', 'CODFUNCAO': '000327', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -2523}
{'CODCOLIGADA': 2, 'CHAPA': '051594', 'NOME': 'BEATRIZ ALBUQUERQUE SOARES', 'CPF': '02262425280', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Supervisor de logística Nivel II', 'DATAADMISSAO': datetime.datetime(2023, 3, 13, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.003', 'CODFUNCAO': '000261', 'SALARIO': Decimal('2724.51'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 2, 'CHAPA': '052298', 'NOME': 'BEATRIZ HELENA SOARES SOUZA', 'CPF': '01554937280', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Coordenador de Transporte', 'DATAADMISSAO': datetime.datetime(2024, 11, 18, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000414', 'SALARIO': Decimal('4245.40'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -880}
{'CODCOLIGADA': 2, 'CHAPA': '051796', 'NOME': 'BEGNO DOS SANTOS GONCALVES', 'CPF': '95490086220', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Motorista Nivel I', 'DATAADMISSAO': datetime.datetime(2023, 12, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000161', 'SALARIO': Decimal('2163.23'), 'CODSINDICATO': '02', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 2, 'CHAPA': '051676', 'NOME': 'BENEDITO LOPES MAIA', 'CPF': '01982292245', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2023, 7, 17, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 3, 'CHAPA': '052601', 'NOME': 'BENTO DO ESPIRITO SANTO PINHEIRO DOS SANTOS', 'CPF': '29926181287', 'SECAO': 'SEGURANCA PATRIMONIAL', 'FUNCAO': 'Fiscal de Loja', 'DATAADMISSAO': datetime.datetime(2025, 10, 6, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.003', 'CODFUNCAO': '000116', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 2694}
{'CODCOLIGADA': 2, 'CHAPA': '044149', 'NOME': 'BERNARD ROGER CABRAL MENDES', 'CPF': '06944386267', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Encarregado de Logistica Nivel I', 'DATAADMISSAO': datetime.datetime(2021, 5, 21, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.003', 'CODFUNCAO': '000259', 'SALARIO': Decimal('1930.60'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 2, 'CHAPA': '052199', 'NOME': 'BRAYAM ESPIRITO SANTO DOS SANTOS', 'CPF': '07659961209', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2024, 10, 7, 0, 0), 'CODSITUACAO': 'F', 'CODSECAO': '001.004.003', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 3, 'CHAPA': '052460', 'NOME': 'BRENDA RABELO XIMENDES', 'CPF': '02211605230', 'SECAO': 'LOJA 7 OPERACIONAL', 'FUNCAO': 'Supervisor de Loja', 'DATAADMISSAO': datetime.datetime(2025, 4, 22, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.008', 'CODFUNCAO': '000240', 'SALARIO': Decimal('2724.51'), 'CODSINDICATO': '01', 'INICIOPER': None, 'FIMPER': None, 'SALDO_MINUTOS': None}
{'CODCOLIGADA': 1, 'CHAPA': '052477', 'NOME': 'BRENDO FAVACHO PINTO', 'CPF': '70173008232', 'SECAO': 'LOJA 1 OPERACIONAL', 'FUNCAO': 'Servicos Gerais', 'DATAADMISSAO': datetime.datetime(2025, 4, 15, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.002', 'CODFUNCAO': '000059', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -51}
{'CODCOLIGADA': 2, 'CHAPA': '051555', 'NOME': 'BRENO FERNANDO PINHEIRO DE DEUS', 'CPF': '05391353211', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Assistente de Estoque IV', 'DATAADMISSAO': datetime.datetime(2023, 1, 2, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.003', 'CODFUNCAO': '000282', 'SALARIO': Decimal('1838.66'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 2, 'CHAPA': '052205', 'NOME': 'BRENO JOSE LIMA DE OLIVEIRA', 'CPF': '96748320259', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2024, 10, 7, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '051496', 'NOME': 'BRENO RIBEIRO DA SILVA', 'CPF': '03636407201', 'SECAO': 'LOJA 4 OPERACIONAL', 'FUNCAO': 'Auxiliar de Reposição', 'DATAADMISSAO': datetime.datetime(2022, 10, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '004.001.002', 'CODFUNCAO': '000327', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 2759}
{'CODCOLIGADA': 1, 'CHAPA': '003411', 'NOME': 'BRUNA RAFAELA MACHADO LOPES', 'CPF': '98696211200', 'SECAO': 'LOJA 4 OPERACIONAL', 'FUNCAO': 'Supervisor Administrativo nível I', 'DATAADMISSAO': datetime.datetime(2018, 5, 21, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '004.001.002', 'CODFUNCAO': '000415', 'SALARIO': Decimal('2454.50'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 25386}
{'CODCOLIGADA': 2, 'CHAPA': '051784', 'NOME': 'BRUNELLE BENILDA GAMA COSTA', 'CPF': '04525597232', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Assistente de Logistica Nivel I', 'DATAADMISSAO': datetime.datetime(2023, 11, 6, 0, 0), 'CODSITUACAO': 'V', 'CODSECAO': '001.004.003', 'CODFUNCAO': '000238', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -440}
{'CODCOLIGADA': 2, 'CHAPA': '052491', 'NOME': 'BRUNO GABRIEL PINTO CORREA', 'CPF': '04694487256', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Assistente Administrativo I', 'DATAADMISSAO': datetime.datetime(2025, 5, 6, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.003', 'CODFUNCAO': '000370', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -167}
{'CODCOLIGADA': 1, 'CHAPA': '052148', 'NOME': 'BRUNO LEONARDO BARBOSA BARRAL', 'CPF': '04229826281', 'SECAO': 'LOJA 8 OPERACIONAL', 'FUNCAO': 'Servicos Gerais', 'DATAADMISSAO': datetime.datetime(2024, 8, 16, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '008.001.002', 'CODFUNCAO': '000059', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 1470}
{'CODCOLIGADA': 1, 'CHAPA': '051583', 'NOME': 'BRUNO PIRES DA CONCEICAO', 'CPF': '96180986215', 'SECAO': 'LOJA 2 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2023, 3, 1, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '002.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 1647}
{'CODCOLIGADA': 2, 'CHAPA': '051716', 'NOME': 'CAIO ANDRADE DOS SANTOS', 'CPF': '07059807233', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Operador de Empilhadeira Nivel I', 'DATAADMISSAO': datetime.datetime(2023, 9, 18, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.003', 'CODFUNCAO': '000377', 'SALARIO': Decimal('2085.05'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -3960}
{'CODCOLIGADA': 1, 'CHAPA': '052168', 'NOME': 'CAIO FERREIRA TORRES', 'CPF': '03678927238', 'SECAO': 'LOJA 5 OPERACIONAL', 'FUNCAO': 'Auxiliar de Estoque Nivel I', 'DATAADMISSAO': datetime.datetime(2024, 9, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '005.001.002', 'CODFUNCAO': '000280', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 2412}
{'CODCOLIGADA': 2, 'CHAPA': '052230', 'NOME': 'CAIO HENRIQUE MACHADO DE SOUSA', 'CPF': '07684191233', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2024, 10, 11, 0, 0), 'CODSITUACAO': 'F', 'CODSECAO': '001.004.003', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 5, 'CHAPA': '022', 'NOME': 'CARLA ADRIANA DE ANDRADE BATISTA', 'CPF': '32791801200', 'SECAO': 'COMPRAS', 'FUNCAO': 'Analista de Compras V', 'DATAADMISSAO': datetime.datetime(2024, 12, 1, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '1.04', 'CODFUNCAO': '000293', 'SALARIO': Decimal('5000.00'), 'CODSINDICATO': '01', 'INICIOPER': None, 'FIMPER': None, 'SALDO_MINUTOS': None}
{'CODCOLIGADA': 1, 'CHAPA': '036124', 'NOME': 'CARLA BIANCA RODRIGUES FERREIRA', 'CPF': '05334206280', 'SECAO': 'FINANCEIRO', 'FUNCAO': 'Analista Financeiro Nivel III', 'DATAADMISSAO': datetime.datetime(2020, 8, 14, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '006.003.001', 'CODFUNCAO': '000368', 'SALARIO': Decimal('2251.85'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 2263}
{'CODCOLIGADA': 3, 'CHAPA': '052535', 'NOME': 'CARLA MARIA BEZERRA DE LIMA', 'CPF': '02641567229', 'SECAO': 'DTI', 'FUNCAO': 'Analista de T.I.', 'DATAADMISSAO': datetime.datetime(2025, 6, 6, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.014', 'CODFUNCAO': '000130', 'SALARIO': Decimal('2085.05'), 'CODSINDICATO': '01', 'INICIOPER': None, 'FIMPER': None, 'SALDO_MINUTOS': None}
{'CODCOLIGADA': 1, 'CHAPA': '003618', 'NOME': 'CARLINDO MONTEIRO BARBOSA', 'CPF': '70257368213', 'SECAO': 'LOGISTICA ESTOQUE', 'FUNCAO': 'Supervisor de Estoque Nivel II', 'DATAADMISSAO': datetime.datetime(2017, 11, 14, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '006.003.013', 'CODFUNCAO': '000168', 'SALARIO': Decimal('2724.51'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 2, 'CHAPA': '051826', 'NOME': 'CARLOS ALBERTO ALVES BEZERRA', 'CPF': '26043130220', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2024, 1, 8, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 2, 'CHAPA': '051765', 'NOME': 'CARLOS ANDRE MONTEIRO FREITAS', 'CPF': '02110115254', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Motorista Nivel I', 'DATAADMISSAO': datetime.datetime(2023, 10, 20, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000161', 'SALARIO': Decimal('2163.23'), 'CODSINDICATO': '02', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '052445', 'NOME': 'CARLOS ARTHUR MORAES FONSECA', 'CPF': '03588147233', 'SECAO': 'LOJA 8 OPERACIONAL', 'FUNCAO': 'Auxiliar de Reposição', 'DATAADMISSAO': datetime.datetime(2025, 3, 7, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '008.001.002', 'CODFUNCAO': '000327', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 1387}
{'CODCOLIGADA': 1, 'CHAPA': '000573', 'NOME': 'CARLOS AUGUSTO DE ARAUJO LIMA', 'CPF': '25436716253', 'SECAO': 'LOJA 9 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas Nivel VI', 'DATAADMISSAO': datetime.datetime(2021, 11, 25, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '009.001.002', 'CODFUNCAO': '000313', 'SALARIO': Decimal('2043.00'), 'CODSINDICATO': '03', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 6407}
{'CODCOLIGADA': 1, 'CHAPA': '052536', 'NOME': 'CARLOS BENEDITO FONSECA DE LIMA', 'CPF': '48738298287', 'SECAO': 'LOJA 3 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2025, 6, 16, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '003.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 2756}
{'CODCOLIGADA': 1, 'CHAPA': '052541', 'NOME': 'CARLOS EDUARDO DOS SANTOS DE OLIVEIRA', 'CPF': '06521825267', 'SECAO': 'LOJA 3 OPERACIONAL', 'FUNCAO': 'APRENDIZ', 'DATAADMISSAO': datetime.datetime(2025, 7, 16, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '003.001.002', 'CODFUNCAO': '000038', 'SALARIO': Decimal('761.55'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 19}
{'CODCOLIGADA': 1, 'CHAPA': '051602', 'NOME': 'CARLOS JOSE DE ALMEIDA ARRUDA', 'CPF': '03822073270', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Operador de Empilhadeira Nivel I', 'DATAADMISSAO': datetime.datetime(2023, 3, 13, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '006.004.004', 'CODFUNCAO': '000377', 'SALARIO': Decimal('2085.05'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -9617}
{'CODCOLIGADA': 1, 'CHAPA': '052166', 'NOME': 'CARLOS VICTOR TORRES AYRES', 'CPF': '05784588290', 'SECAO': 'LOGISTICA ESTOQUE', 'FUNCAO': 'Assistente de Estoque IV', 'DATAADMISSAO': datetime.datetime(2024, 9, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '006.003.013', 'CODFUNCAO': '000282', 'SALARIO': Decimal('1838.66'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 5424}
{'CODCOLIGADA': 2, 'CHAPA': '051900', 'NOME': 'CAROLINA SOUSA PINHEIRO', 'CPF': '03436164240', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Assistente de Logistica Nivel I', 'DATAADMISSAO': datetime.datetime(2024, 5, 6, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.003', 'CODFUNCAO': '000238', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '051686', 'NOME': 'CASSIO WESLEN DA SILVA', 'CPF': '06098165270', 'SECAO': 'LOJA 8 OPERACIONAL', 'FUNCAO': 'Auxiliar de Estoque Nivel I', 'DATAADMISSAO': datetime.datetime(2023, 8, 7, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '008.001.002', 'CODFUNCAO': '000280', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 2032}
{'CODCOLIGADA': 1, 'CHAPA': '052540', 'NOME': 'CAUA FRANCO GOMES', 'CPF': '07825756258', 'SECAO': 'LOJA 4 OPERACIONAL', 'FUNCAO': 'APRENDIZ', 'DATAADMISSAO': datetime.datetime(2025, 6, 18, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '004.001.002', 'CODFUNCAO': '000038', 'SALARIO': Decimal('761.55'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -1052}
{'CODCOLIGADA': 1, 'CHAPA': '026106', 'NOME': 'CECILIA MARIA LISBOA SAMPAIO', 'CPF': '04292240280', 'SECAO': 'LOJA 4 OPERACIONAL', 'FUNCAO': 'ASSISTENTE DE CREDITO', 'DATAADMISSAO': datetime.datetime(2021, 3, 1, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '004.001.002', 'CODFUNCAO': '000134', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 10360}
{'CODCOLIGADA': 3, 'CHAPA': '052364', 'NOME': 'CHARLES BASTOS BRASIL', 'CPF': '63063042234', 'SECAO': 'SEGURANCA PATRIMONIAL', 'FUNCAO': 'Fiscal de Loja', 'DATAADMISSAO': datetime.datetime(2025, 1, 15, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.003', 'CODFUNCAO': '000116', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 1208}
{'CODCOLIGADA': 5, 'CHAPA': '014', 'NOME': 'CICERO NAIDEL FERREIRA DE CARVALHO', 'CPF': '03650633396', 'SECAO': 'COMERCIAL', 'FUNCAO': 'Gerente Comercial', 'DATAADMISSAO': datetime.datetime(2024, 6, 6, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '1.06', 'CODFUNCAO': '000329', 'SALARIO': Decimal('18573.63'), 'CODSINDICATO': '01', 'INICIOPER': None, 'FIMPER': None, 'SALDO_MINUTOS': None}
{'CODCOLIGADA': 2, 'CHAPA': '051924', 'NOME': 'CIRINEU CORREA SOUSA', 'CPF': '08014015266', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2024, 5, 15, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.003', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '003432', 'NOME': 'CLARISSE DE MELO CARDOSO NUNES', 'CPF': '75211939204', 'SECAO': 'LOJA 8 OPERACIONAL', 'FUNCAO': 'ASSISTENTE DE CREDITO', 'DATAADMISSAO': datetime.datetime(2017, 11, 14, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '008.001.002', 'CODFUNCAO': '000134', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 5661}
{'CODCOLIGADA': 2, 'CHAPA': '004442', 'NOME': 'CLAUDECIR LIMA SALES', 'CPF': '02858106266', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Encarregado de Logistica Nivel I', 'DATAADMISSAO': datetime.datetime(2019, 11, 21, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.003', 'CODFUNCAO': '000259', 'SALARIO': Decimal('1930.60'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '003372', 'NOME': 'CLAUDENOR COSTA RAIOL', 'CPF': '00856933244', 'SECAO': 'LOJA 2 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2022, 5, 3, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '002.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 20218}
{'CODCOLIGADA': 1, 'CHAPA': '051478', 'NOME': 'CLAUDIA DAYANE SOUSA RIBEIRO', 'CPF': '70055765270', 'SECAO': 'LOJA 4 OPERACIONAL', 'FUNCAO': 'Operador de Caixa', 'DATAADMISSAO': datetime.datetime(2022, 8, 16, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '004.001.002', 'CODFUNCAO': '000042', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 3706}
{'CODCOLIGADA': 2, 'CHAPA': '052432', 'NOME': 'CLAUDIA REGINA MARTINS AZEVEDO', 'CPF': '61157333249', 'SECAO': 'LOGISTICA OPERACIONAL BR', 'FUNCAO': 'Servicos Gerais', 'DATAADMISSAO': datetime.datetime(2025, 2, 17, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.005', 'CODFUNCAO': '000165', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '000002', 'NOME': 'CLAUDIO DE ANDRADE BATISTA', 'CPF': '81496052234', 'SECAO': 'DIRETORIA', 'FUNCAO': 'Socio Administrador', 'DATAADMISSAO': datetime.datetime(2017, 9, 1, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '006.003.009', 'CODFUNCAO': '000020', 'SALARIO': Decimal('10000.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 2, 'CHAPA': '052575', 'NOME': 'CLAUDIO RONALDO MARREIROS PINTO', 'CPF': '66961530206', 'SECAO': 'DIRETORIA', 'FUNCAO': 'Motorista Nivel I', 'DATAADMISSAO': datetime.datetime(2025, 8, 28, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.003.009', 'CODFUNCAO': '000161', 'SALARIO': Decimal('2163.23'), 'CODSINDICATO': '02', 'INICIOPER': None, 'FIMPER': None, 'SALDO_MINUTOS': None}
{'CODCOLIGADA': 1, 'CHAPA': '000513', 'NOME': 'CLAYTON CARDOSO DOMINGUES', 'CPF': '78835470200', 'SECAO': 'LOJA 1 OPERACIONAL', 'FUNCAO': 'Assistente de Estoque IV', 'DATAADMISSAO': datetime.datetime(2021, 7, 12, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.002', 'CODFUNCAO': '000282', 'SALARIO': Decimal('1838.66'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 17700}
{'CODCOLIGADA': 2, 'CHAPA': '044138', 'NOME': 'CLEIDSON DA COSTA DOS SANTOS', 'CPF': '63973740259', 'SECAO': 'SEGURANCA PATRIMONIAL', 'FUNCAO': 'Fiscal de Loja', 'DATAADMISSAO': datetime.datetime(2021, 4, 27, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.003.010', 'CODFUNCAO': '000116', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 177}
{'CODCOLIGADA': 2, 'CHAPA': '052409', 'NOME': 'CLEITON MAUES DOS SANTOS', 'CPF': '78739519287', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Motorista Nivel I', 'DATAADMISSAO': datetime.datetime(2025, 2, 3, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000161', 'SALARIO': Decimal('2163.23'), 'CODSINDICATO': '02', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 2, 'CHAPA': '004468', 'NOME': 'CLEMENTE ANTONIO CARMO DA COSTA', 'CPF': '80858589249', 'SECAO': 'LOJA 1 OPERACIONAL', 'FUNCAO': 'Supervisor de Loja', 'DATAADMISSAO': datetime.datetime(2020, 7, 1, 0, 0), 'CODSITUACAO': 'F', 'CODSECAO': '001.001.001', 'CODFUNCAO': '000240', 'SALARIO': Decimal('2724.51'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 2, 'CHAPA': '051746', 'NOME': 'CLEYTON CLEBER LIMA DE SOUZA', 'CPF': '75886332200', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Motoboy', 'DATAADMISSAO': datetime.datetime(2023, 10, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000032', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 2, 'CHAPA': '052309', 'NOME': 'CLOVIS FERREIRA DA SILVA', 'CPF': '75331551220', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2024, 11, 18, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.003', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '052584', 'NOME': 'CRISTHIAN LORRAN SARAIVA DE LIMA', 'CPF': '06541856206', 'SECAO': 'LOJA 1 OPERACIONAL', 'FUNCAO': 'Auxiliar de Reposição', 'DATAADMISSAO': datetime.datetime(2025, 9, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.002', 'CODFUNCAO': '000327', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -3349}
{'CODCOLIGADA': 2, 'CHAPA': '051747', 'NOME': 'CRISTIANO CEZAR PINHEIRO GONZALEZ', 'CPF': '02051952299', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2023, 10, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.003', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '051663', 'NOME': 'CRISTIANO LAZARO GAMA TEIXEIRA', 'CPF': '45141207234', 'SECAO': 'LOJA 8 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2023, 6, 12, 0, 0), 'CODSITUACAO': 'F', 'CODSECAO': '008.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 2415}
{'CODCOLIGADA': 2, 'CHAPA': '052130', 'NOME': 'CRISTIANO SILVA DE SOUZA', 'CPF': '00437521281', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2024, 8, 6, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '051689', 'NOME': 'DAIANE DE ALMEIDA DAMASCENO DE SOUSA', 'CPF': '02834659214', 'SECAO': 'LOJA 2 OPERACIONAL', 'FUNCAO': 'ASSISTENTE DE CREDITO', 'DATAADMISSAO': datetime.datetime(2023, 8, 7, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '002.001.002', 'CODFUNCAO': '000134', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 1741}
{'CODCOLIGADA': 2, 'CHAPA': '052034', 'NOME': 'DANIEL DA SILVA', 'CPF': '02407986270', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2024, 6, 28, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.003', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 3, 'CHAPA': '051713', 'NOME': 'DANIEL DO NASCIMENTO PANTOJA', 'CPF': '03923484208', 'SECAO': 'MARKETING', 'FUNCAO': 'Gerente de Marketing Nivel IV', 'DATAADMISSAO': datetime.datetime(2023, 9, 13, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.004', 'CODFUNCAO': '000427', 'SALARIO': Decimal('6998.73'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 951}
{'CODCOLIGADA': 2, 'CHAPA': '052570', 'NOME': 'DANIEL FERREIRA ALVES', 'CPF': '01242864296', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2025, 8, 20, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 3, 'CHAPA': '052622', 'NOME': 'DANIEL PORTELA SOARES DA SILVA', 'CPF': '95050965268', 'SECAO': 'MARKETING', 'FUNCAO': 'Supervisor de Marketing Nivel VII', 'DATAADMISSAO': datetime.datetime(2026, 1, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.004', 'CODFUNCAO': '000428', 'SALARIO': Decimal('4467.63'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -480}
{'CODCOLIGADA': 1, 'CHAPA': '052610', 'NOME': 'DANIEL YAN MELO DA SILVA', 'CPF': '02848963220', 'SECAO': 'LOJA 4 OPERACIONAL', 'FUNCAO': 'Auxiliar de Reposição', 'DATAADMISSAO': datetime.datetime(2025, 11, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '004.001.002', 'CODFUNCAO': '000327', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 3526}
{'CODCOLIGADA': 1, 'CHAPA': '003933', 'NOME': 'DANIELLE FERNANDA LIMA NOGUEIRA', 'CPF': '74838334249', 'SECAO': 'LOJA 4 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2020, 10, 6, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '004.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 13102}
{'CODCOLIGADA': 2, 'CHAPA': '052346', 'NOME': 'DANILO DA CONCEICAO CARDOSO', 'CPF': '06330526206', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2024, 12, 17, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '005719', 'NOME': 'DANILO PEREIRA MODESTO', 'CPF': '01967065217', 'SECAO': 'SEGURANCA PATRIMONIAL', 'FUNCAO': 'Fiscal de loja Nivel VI', 'DATAADMISSAO': datetime.datetime(2021, 12, 9, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '009.001.004', 'CODFUNCAO': '000318', 'SALARIO': Decimal('2043.00'), 'CODSINDICATO': '03', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -2455}
{'CODCOLIGADA': 1, 'CHAPA': '003451', 'NOME': 'DARLENE SANTOS SILVA', 'CPF': '80429742215', 'SECAO': 'LOJA 2 OPERACIONAL', 'FUNCAO': 'Supervisor Administrativo nível I', 'DATAADMISSAO': datetime.datetime(2021, 5, 12, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '002.001.002', 'CODFUNCAO': '000415', 'SALARIO': Decimal('2454.50'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 36420}
{'CODCOLIGADA': 2, 'CHAPA': '052136', 'NOME': 'DAVI DA SILVA GOMES', 'CPF': '03416905202', 'SECAO': 'LOGISTICA ESTOQUE', 'FUNCAO': 'Assistente de Estoque IV', 'DATAADMISSAO': datetime.datetime(2024, 8, 6, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.003.013', 'CODFUNCAO': '000282', 'SALARIO': Decimal('1838.66'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 3, 'CHAPA': '051741', 'NOME': 'DAVID CHAVES DE ABREU', 'CPF': '02305282281', 'SECAO': 'SEGURANCA PATRIMONIAL', 'FUNCAO': 'Fiscal de Loja', 'DATAADMISSAO': datetime.datetime(2023, 9, 21, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.003', 'CODFUNCAO': '000116', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 4697}
{'CODCOLIGADA': 3, 'CHAPA': '051800', 'NOME': 'DAYANARA RAISSA MONTEIRO PEGADO', 'CPF': '01326200224', 'SECAO': 'LOJA 7 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas Nivel IV', 'DATAADMISSAO': datetime.datetime(2023, 12, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.008', 'CODFUNCAO': '000294', 'SALARIO': Decimal('1838.66'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 20462}
{'CODCOLIGADA': 1, 'CHAPA': '003655', 'NOME': 'DAYVID HENRIQUE NUNES MEDEIROS', 'CPF': '77886216253', 'SECAO': 'LOJA 4 OPERACIONAL', 'FUNCAO': 'Encarregado de Estoque Nivel IV', 'DATAADMISSAO': datetime.datetime(2017, 11, 14, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '004.001.002', 'CODFUNCAO': '000309', 'SALARIO': Decimal('2454.50'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 18723}
{'CODCOLIGADA': 2, 'CHAPA': '052317', 'NOME': 'DEJACI BRITO DA SILVA', 'CPF': '01736745263', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2024, 12, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 3, 'CHAPA': '051651', 'NOME': 'DELIO DE ANDRADE BATISTA', 'CPF': '90884396215', 'SECAO': 'DIRETORIA', 'FUNCAO': 'Socio Administrador', 'DATAADMISSAO': datetime.datetime(2023, 5, 1, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.013', 'CODFUNCAO': '000020', 'SALARIO': Decimal('8000.00'), 'CODSINDICATO': '01', 'INICIOPER': None, 'FIMPER': None, 'SALDO_MINUTOS': None}
{'CODCOLIGADA': 1, 'CHAPA': '052284', 'NOME': 'DELSON SANTANA DO AMARAL', 'CPF': '85171255253', 'SECAO': 'LOJA 9 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas Nivel VI', 'DATAADMISSAO': datetime.datetime(2024, 11, 18, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '009.001.002', 'CODFUNCAO': '000313', 'SALARIO': Decimal('2043.00'), 'CODSINDICATO': '03', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 911}
{'CODCOLIGADA': 1, 'CHAPA': '005713', 'NOME': 'DENILSE DE OLIVEIRA TRINDADE', 'CPF': '06806388221', 'SECAO': 'LOJA 9 OPERACIONAL', 'FUNCAO': 'Supervisor de Loja', 'DATAADMISSAO': datetime.datetime(2021, 11, 24, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '009.001.002', 'CODFUNCAO': '000240', 'SALARIO': Decimal('2724.51'), 'CODSINDICATO': '03', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 3002}
{'CODCOLIGADA': 1, 'CHAPA': '051572', 'NOME': 'DENILSON FERREIRA DE SOUZA', 'CPF': '46243631249', 'SECAO': 'LOJA 5 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2023, 2, 6, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '005.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 1722}
{'CODCOLIGADA': 3, 'CHAPA': '051869', 'NOME': 'DENISE FERNANDA GUIMARAES FERNANDES', 'CPF': '00493768297', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Supervisor de logística Nivel II', 'DATAADMISSAO': datetime.datetime(2024, 4, 3, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.017', 'CODFUNCAO': '000261', 'SALARIO': Decimal('2724.51'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '003919', 'NOME': 'DENISE MAUES MACEDO', 'CPF': '94521212204', 'SECAO': 'LOJA 8 OPERACIONAL', 'FUNCAO': 'Supervisor de Loja', 'DATAADMISSAO': datetime.datetime(2020, 3, 20, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '008.001.002', 'CODFUNCAO': '000240', 'SALARIO': Decimal('2724.51'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '051936', 'NOME': 'DENIZE DO REMEDIO FERREIRA CAVALCANTE', 'CPF': '85768456287', 'SECAO': 'LOJA 10 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2024, 7, 1, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '010.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '05', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 12801}
{'CODCOLIGADA': 2, 'CHAPA': '051917', 'NOME': 'DENNIS JUNIOR RODRIGUES FARO', 'CPF': '55079261234', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Motorista Nivel I', 'DATAADMISSAO': datetime.datetime(2024, 5, 6, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000161', 'SALARIO': Decimal('2163.23'), 'CODSINDICATO': '02', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '051830', 'NOME': 'DERICK DAVISON CORREA DE ARAUJO', 'CPF': '92777457204', 'SECAO': 'LOJA 8 OPERACIONAL', 'FUNCAO': 'Auxiliar de Reposição', 'DATAADMISSAO': datetime.datetime(2024, 1, 18, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '008.001.002', 'CODFUNCAO': '000327', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 838}
{'CODCOLIGADA': 2, 'CHAPA': '044928', 'NOME': 'DIEGO CASTRO PINHEIRO', 'CPF': '93467346200', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2022, 2, 1, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '036165', 'NOME': 'DIEGO FELIPE DA SILVA MOURA', 'CPF': '92569366234', 'SECAO': 'LOJA 4 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2022, 5, 3, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '004.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 9342}
{'CODCOLIGADA': 3, 'CHAPA': '051804', 'NOME': 'DIEGO YAN OLIVEIRA DE LIMA', 'CPF': '06855322247', 'SECAO': 'LOJA 1 OPERACIONAL ', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2023, 12, 15, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.019', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 6290}
{'CODCOLIGADA': 2, 'CHAPA': '051590', 'NOME': 'DIOGO JOSE SILVA DE ARAUJO', 'CPF': '06049840229', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Operador de Empilhadeira Nivel I', 'DATAADMISSAO': datetime.datetime(2023, 3, 8, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.003', 'CODFUNCAO': '000377', 'SALARIO': Decimal('2085.05'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 2, 'CHAPA': '051814', 'NOME': 'DJALMA LUCIO MACIEL DE CASTRO', 'CPF': '83909893287', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2024, 1, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 3, 'CHAPA': '051851', 'NOME': 'DOUGLAS ALVES NASCIMENTO', 'CPF': '03006119274', 'SECAO': 'CONTABILIDADE', 'FUNCAO': 'Assistente Administrativo I', 'DATAADMISSAO': datetime.datetime(2024, 2, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.002', 'CODFUNCAO': '000370', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -884}
{'CODCOLIGADA': 1, 'CHAPA': '052059', 'NOME': 'DOUGLAS CHRISTIANO FARIAS SANTOS', 'CPF': '01761691210', 'SECAO': 'LOJA 9 OPERACIONAL', 'FUNCAO': 'Auxiliar de Estoque Nivel I', 'DATAADMISSAO': datetime.datetime(2024, 9, 19, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '009.001.002', 'CODFUNCAO': '000280', 'SALARIO': Decimal('1851.00'), 'CODSINDICATO': '03', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -1815}
{'CODCOLIGADA': 1, 'CHAPA': '051806', 'NOME': 'DOUGLAS LIMA DO NASCIMENTO', 'CPF': '02948827230', 'SECAO': 'LOJA 1 OPERACIONAL', 'FUNCAO': 'Supervisor de Estoque Nivel II', 'DATAADMISSAO': datetime.datetime(2023, 12, 15, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.002', 'CODFUNCAO': '000168', 'SALARIO': Decimal('2724.51'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -480}
{'CODCOLIGADA': 5, 'CHAPA': '031', 'NOME': 'EDCACIO BRUNO TEIXEIRA DAS NEVES', 'CPF': '03310171213', 'SECAO': 'LOGISTICA OPERACIONAL BR', 'FUNCAO': 'Encarregado de Logistica Nivel III', 'DATAADMISSAO': datetime.datetime(2025, 7, 1, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '1.08', 'CODFUNCAO': '000424', 'SALARIO': Decimal('2251.85'), 'CODSINDICATO': '01', 'INICIOPER': None, 'FIMPER': None, 'SALDO_MINUTOS': None}
{'CODCOLIGADA': 2, 'CHAPA': '051887', 'NOME': 'EDENILSON BRAGANCA LEAL RODRIGUES', 'CPF': '55755895287', 'SECAO': 'SEGURANCA PATRIMONIAL', 'FUNCAO': 'Fiscal de Loja', 'DATAADMISSAO': datetime.datetime(2024, 4, 15, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.003.010', 'CODFUNCAO': '000116', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '051469', 'NOME': 'EDICIRENE BARBOSA TAVARES', 'CPF': '42791880259', 'SECAO': 'LOJA 1 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2022, 8, 1, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -1740}
{'CODCOLIGADA': 1, 'CHAPA': '003674', 'NOME': 'EDICLEI MACIEL MORAES', 'CPF': '00577864297', 'SECAO': 'LOJA 4 OPERACIONAL', 'FUNCAO': 'Embalador', 'DATAADMISSAO': datetime.datetime(2018, 10, 3, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '004.001.002', 'CODFUNCAO': '000075', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -2364}
{'CODCOLIGADA': 1, 'CHAPA': '051822', 'NOME': 'EDIEL DE SOUZA SOARES', 'CPF': '69232555204', 'SECAO': 'LOJA 8 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2024, 1, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '008.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 798}
{'CODCOLIGADA': 1, 'CHAPA': '052041', 'NOME': 'EDIL DE JESUS CARDOSO', 'CPF': '00461875292', 'SECAO': 'LOJA 9 LOGISTICA', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2024, 7, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '009.001.003', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1851.00'), 'CODSINDICATO': '03', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 3, 'CHAPA': '003832', 'NOME': 'EDILTON FONSECA DA SILVA', 'CPF': '25132962220', 'SECAO': 'SEGURANCA PATRIMONIAL', 'FUNCAO': 'Fiscal de Loja', 'DATAADMISSAO': datetime.datetime(2022, 7, 25, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.003', 'CODFUNCAO': '000116', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 2805}
{'CODCOLIGADA': 1, 'CHAPA': '052042', 'NOME': 'EDINALDO LIMA DO AMARAL', 'CPF': '04018026200', 'SECAO': 'LOJA 9 OPERACIONAL', 'FUNCAO': 'Auxiliar de Estoque Nivel I', 'DATAADMISSAO': datetime.datetime(2024, 7, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '009.001.002', 'CODFUNCAO': '000280', 'SALARIO': Decimal('1851.00'), 'CODSINDICATO': '03', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 329}
{'CODCOLIGADA': 2, 'CHAPA': '044142', 'NOME': 'EDIRLEI DA SILVA NEGRAO', 'CPF': '93313063268', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2021, 5, 10, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 2, 'CHAPA': '051910', 'NOME': 'EDIVALDO DA SILVA NEGRAO', 'CPF': '60856181234', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Motorista Nivel I', 'DATAADMISSAO': datetime.datetime(2024, 5, 6, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000161', 'SALARIO': Decimal('2163.23'), 'CODSINDICATO': '02', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 3, 'CHAPA': '003846', 'NOME': 'EDMILSON SILVA DE SOUZA', 'CPF': '29984556204', 'SECAO': 'SEGURANCA PATRIMONIAL', 'FUNCAO': 'Fiscal de Loja', 'DATAADMISSAO': datetime.datetime(2022, 11, 1, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.003', 'CODFUNCAO': '000116', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 4257}
{'CODCOLIGADA': 2, 'CHAPA': '052206', 'NOME': 'EDMILSON SOUSA REIS', 'CPF': '71241787204', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2024, 10, 7, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.003', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '051484', 'NOME': 'EDNETH MELO OLIVEIRA', 'CPF': '73029653234', 'SECAO': 'COMPRAS', 'FUNCAO': 'Analista de Compras IV', 'DATAADMISSAO': datetime.datetime(2022, 9, 1, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '006.003.006', 'CODFUNCAO': '000424', 'SALARIO': Decimal('2454.50'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -146}
{'CODCOLIGADA': 2, 'CHAPA': '004499', 'NOME': 'EDUARDO CLEITON SILVA SANTOS', 'CPF': '83184341291', 'SECAO': 'SEGURANCA PATRIMONIAL', 'FUNCAO': 'Fiscal de Loja', 'DATAADMISSAO': datetime.datetime(2020, 11, 25, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.003.010', 'CODFUNCAO': '000116', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -2788}
{'CODCOLIGADA': 1, 'CHAPA': '000265', 'NOME': 'EDUARDO LEONI SANTOS DA GAMA', 'CPF': '01899875298', 'SECAO': 'LOJA 8 OPERACIONAL', 'FUNCAO': 'Supervisor de Estoque Nivel II', 'DATAADMISSAO': datetime.datetime(2017, 11, 20, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '008.001.002', 'CODFUNCAO': '000168', 'SALARIO': Decimal('2724.51'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 39069}
{'CODCOLIGADA': 2, 'CHAPA': '052521', 'NOME': 'EDUARDO SA PEREIRA', 'CPF': '03408591210', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2025, 5, 23, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.003', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '003421', 'NOME': 'ELBER JUNIOR LISBOA TEIXEIRA', 'CPF': '91834660297', 'SECAO': 'LOJA 3 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2019, 6, 1, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '003.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 1882}
{'CODCOLIGADA': 2, 'CHAPA': '051516', 'NOME': 'ELDELITO DIAS BATISTA', 'CPF': '24577464268', 'SECAO': 'DIRETORIA', 'FUNCAO': 'Socio Administrador', 'DATAADMISSAO': datetime.datetime(2018, 12, 1, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.003.009', 'CODFUNCAO': '000020', 'SALARIO': Decimal('8000.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 2, 'CHAPA': '052004', 'NOME': 'ELIANE CRISTINA VIEIRA DA CRUZ', 'CPF': '63400375268', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Assistente de Logistica Nivel I', 'DATAADMISSAO': datetime.datetime(2024, 6, 21, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.003', 'CODFUNCAO': '000238', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '051476', 'NOME': 'ELIANE LOPES MAIA', 'CPF': '98458078287', 'SECAO': 'LOJA 1 OPERACIONAL', 'FUNCAO': 'ASSISTENTE DE CREDITO', 'DATAADMISSAO': datetime.datetime(2022, 8, 16, 0, 0), 'CODSITUACAO': 'F', 'CODSECAO': '001.001.002', 'CODFUNCAO': '000134', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 10215}
{'CODCOLIGADA': 3, 'CHAPA': '052503', 'NOME': 'ELIAS CARVALHO DA COSTA', 'CPF': '03456086237', 'SECAO': 'MARKETING', 'FUNCAO': 'Analista de Marketing Nivel III', 'DATAADMISSAO': datetime.datetime(2025, 5, 15, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.004', 'CODFUNCAO': '000332', 'SALARIO': Decimal('2251.85'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -1016}
{'CODCOLIGADA': 2, 'CHAPA': '052360', 'NOME': 'ELIAS VITOR BARROS FREITAS', 'CPF': '07517413295', 'SECAO': 'LOGISTICA OPERACIONAL BR', 'FUNCAO': 'Operador de Empilhadeira Nivel III', 'DATAADMISSAO': datetime.datetime(2025, 1, 15, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.005', 'CODFUNCAO': '000056', 'SALARIO': Decimal('2165.24'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 2, 'CHAPA': '051749', 'NOME': 'ELIENAI PALHETA RIBEIRO', 'CPF': '00774466235', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2023, 10, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.003', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '051859', 'NOME': 'ELISANGELA NAZARE AZEVEDO DA SILVA', 'CPF': '64206041253', 'SECAO': 'LOJA 5 OPERACIONAL', 'FUNCAO': 'Operador de Caixa', 'DATAADMISSAO': datetime.datetime(2024, 3, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '005.001.002', 'CODFUNCAO': '000042', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 13310}
{'CODCOLIGADA': 3, 'CHAPA': '051853', 'NOME': 'ELISANGELA SILVA DE BRITO', 'CPF': '59924845234', 'SECAO': 'GENTE E GESTAO', 'FUNCAO': 'Coordenador(a) de Gente e Gestão', 'DATAADMISSAO': datetime.datetime(2024, 2, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.009', 'CODFUNCAO': '000422', 'SALARIO': Decimal('4067.48'), 'CODSINDICATO': '01', 'INICIOPER': None, 'FIMPER': None, 'SALDO_MINUTOS': None}
{'CODCOLIGADA': 1, 'CHAPA': '052177', 'NOME': 'ELISEU TEIXEIRA DE ASSIS', 'CPF': '83816917291', 'SECAO': 'LOJA 4 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2024, 9, 19, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '004.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 9394}
{'CODCOLIGADA': 2, 'CHAPA': '052638', 'NOME': 'ELISIVALDO ROCHA DOS SANTOS', 'CPF': '03468969244', 'SECAO': 'LOGISTICA SUPPLY', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2026, 2, 5, 0, 0), 'CODSITUACAO': 'Z', 'CODSECAO': '001.004.006', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': None, 'FIMPER': None, 'SALDO_MINUTOS': None}
{'CODCOLIGADA': 2, 'CHAPA': '052406', 'NOME': 'ELISSON RODRIGO SILVA GONCALVES', 'CPF': '01182319289', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Motorista Nivel I', 'DATAADMISSAO': datetime.datetime(2025, 2, 3, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000161', 'SALARIO': Decimal('2163.23'), 'CODSINDICATO': '02', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '003669', 'NOME': 'ELIVONE MARIA GOMES VIEIRA', 'CPF': '32721919253', 'SECAO': 'LOJA 4 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2018, 6, 1, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '004.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 2199}
{'CODCOLIGADA': 1, 'CHAPA': '052560', 'NOME': 'ELIZA CRISTINE MACIEL ALHO', 'CPF': '04588532243', 'SECAO': 'LOJA 7 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas Nivel IV', 'DATAADMISSAO': datetime.datetime(2025, 8, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '007.001.002', 'CODFUNCAO': '000294', 'SALARIO': Decimal('1838.66'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 3440}
{'CODCOLIGADA': 1, 'CHAPA': '052187', 'NOME': 'ELIZANDRA FIGUEIRO CARDOSO', 'CPF': '01345487282', 'SECAO': 'LOJA 10 OPERACIONAL', 'FUNCAO': 'ASSISTENTE DE CREDITO', 'DATAADMISSAO': datetime.datetime(2024, 10, 7, 0, 0), 'CODSITUACAO': 'F', 'CODSECAO': '010.001.002', 'CODFUNCAO': '000134', 'SALARIO': Decimal('1780.00'), 'CODSINDICATO': '05', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 6581}
{'CODCOLIGADA': 1, 'CHAPA': '052258', 'NOME': 'ELOM SILVA LOUREIRO', 'CPF': '86302930200', 'SECAO': 'LOJA 3 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2024, 11, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '003.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 7059}
{'CODCOLIGADA': 1, 'CHAPA': '036140', 'NOME': 'ELZIRENE DO CARMO MARTINS AGRA FARIAS', 'CPF': '41409221253', 'SECAO': 'DIRETORIA', 'FUNCAO': 'Servicos Gerais', 'DATAADMISSAO': datetime.datetime(2020, 3, 4, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '006.003.009', 'CODFUNCAO': '000165', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 237}
{'CODCOLIGADA': 1, 'CHAPA': '052605', 'NOME': 'EMERSON COSTA VIEIRA', 'CPF': '06351142245', 'SECAO': 'LOJA 1 OPERACIONAL', 'FUNCAO': 'Operador de Caixa', 'DATAADMISSAO': datetime.datetime(2025, 11, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.002', 'CODFUNCAO': '000042', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 1712}
{'CODCOLIGADA': 1, 'CHAPA': '051639', 'NOME': 'EMERSON MENDES DA LUZ', 'CPF': '45088831846', 'SECAO': 'LOGISTICA ESTOQUE', 'FUNCAO': 'Encarregado de Logistica Nivel I', 'DATAADMISSAO': datetime.datetime(2023, 5, 9, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '006.003.013', 'CODFUNCAO': '000259', 'SALARIO': Decimal('1930.60'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 18790}
{'CODCOLIGADA': 2, 'CHAPA': '052155', 'NOME': 'EMIDIO RAIMUNDO PAMPLONA BANDEIRA', 'CPF': '88434176220', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2024, 9, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 2, 'CHAPA': '044878', 'NOME': 'ENDEON NIK SOARES D ALMEIDA', 'CPF': '54491940215', 'SECAO': 'SEGURANCA PATRIMONIAL', 'FUNCAO': 'Fiscal de Loja', 'DATAADMISSAO': datetime.datetime(2021, 8, 23, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.003.010', 'CODFUNCAO': '000116', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 1116}
{'CODCOLIGADA': 2, 'CHAPA': '052289', 'NOME': 'ERIC PRIMO DA SILVA', 'CPF': '05256015206', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2024, 11, 18, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.003', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 2, 'CHAPA': '052583', 'NOME': 'ERICK BENICIO DA SILVA', 'CPF': '07861317218', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2025, 9, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 3, 'CHAPA': '003834', 'NOME': 'ERICK FABRICIO NASCIMENTO NOGUEIRA DE SOUZA', 'CPF': '01834727219', 'SECAO': 'COMERCIAL', 'FUNCAO': 'ANALISTA ADMINISTRATIVO NIVEL I', 'DATAADMISSAO': datetime.datetime(2022, 7, 25, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.018', 'CODFUNCAO': '000429', 'SALARIO': Decimal('2454.50'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 5832}
{'CODCOLIGADA': 1, 'CHAPA': '052461', 'NOME': 'ERICK SANTOS LEITE', 'CPF': '03676700201', 'SECAO': 'LOJA 10 LOGISTICA ', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2025, 4, 4, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '010.001.003', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1780.00'), 'CODSINDICATO': '05', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -603}
{'CODCOLIGADA': 2, 'CHAPA': '051669', 'NOME': 'ERICO RODRIGO DO ROSARIO ARIAS', 'CPF': '01393046223', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Operador de Empilhadeira Nivel I', 'DATAADMISSAO': datetime.datetime(2023, 7, 6, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.003', 'CODFUNCAO': '000377', 'SALARIO': Decimal('2085.05'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '003627', 'NOME': 'ERIKA PRISCILA CARDOSO AMARAL', 'CPF': '98097156253', 'SECAO': 'LOJA 4 OPERACIONAL', 'FUNCAO': 'Operador de Caixa', 'DATAADMISSAO': datetime.datetime(2017, 11, 14, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '004.001.002', 'CODFUNCAO': '000163', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 4320}
{'CODCOLIGADA': 2, 'CHAPA': '051544', 'NOME': 'EUDES ALMEIDA PEREIRA', 'CPF': '77426843220', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2023, 1, 2, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '005712', 'NOME': 'EURINEIA MANOS VIEIRA', 'CPF': '57588546204', 'SECAO': 'LOJA 9 OPERACIONAL', 'FUNCAO': 'Supervisor Administrativo nível I', 'DATAADMISSAO': datetime.datetime(2021, 11, 24, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '009.001.002', 'CODFUNCAO': '000415', 'SALARIO': Decimal('2454.50'), 'CODSINDICATO': '03', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 23788}
{'CODCOLIGADA': 2, 'CHAPA': '052217', 'NOME': 'EVALDO ADRIEL SOUSA LOPES', 'CPF': '04245969202', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Assistente de Logistica Nivel I', 'DATAADMISSAO': datetime.datetime(2024, 10, 7, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.003', 'CODFUNCAO': '000238', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 2, 'CHAPA': '051890', 'NOME': 'EVANDRO SOUZA DA SILVA', 'CPF': '04783527270', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2024, 4, 15, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '036154', 'NOME': 'EVERALDO BATISTA JAIME', 'CPF': '70301440239', 'SECAO': 'LOJA 4 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2021, 10, 14, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '004.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 6367}
{'CODCOLIGADA': 1, 'CHAPA': '003466', 'NOME': 'EVERALDO ROBERTO PEREIRA DOS SANTOS', 'CPF': '14563576204', 'SECAO': 'LOJA 3 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2022, 5, 3, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '003.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 6544}
{'CODCOLIGADA': 1, 'CHAPA': '036158', 'NOME': 'EVERSON SANTOS DA COSTA', 'CPF': '02084381223', 'SECAO': 'LOJA 4 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2022, 2, 26, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '004.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 9915}
{'CODCOLIGADA': 2, 'CHAPA': '052207', 'NOME': 'EVERTON ANAISSE DE SOUZA', 'CPF': '95831908291', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2024, 10, 7, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 2, 'CHAPA': '052571', 'NOME': 'EVERTON PATRICK MARTINS DA COSTA', 'CPF': '04545946232', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2025, 8, 20, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.003', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 3, 'CHAPA': '052482', 'NOME': 'EWERSON ALVES SIQUEIRA', 'CPF': '05531668244', 'SECAO': 'SEGURANCA PATRIMONIAL', 'FUNCAO': 'Fiscal de Loja', 'DATAADMISSAO': datetime.datetime(2025, 4, 17, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.003', 'CODFUNCAO': '000116', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 205}
{'CODCOLIGADA': 2, 'CHAPA': '004462', 'NOME': 'EWERTON ACACIO DE SOUZA', 'CPF': '70223327204', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2020, 7, 6, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '052449', 'NOME': 'FABIANO SILVA DOS SANTOS', 'CPF': '02472105282', 'SECAO': 'LOGISTICA OPERACIONAL BR', 'FUNCAO': 'Auxiliar de Estoque Nivel I', 'DATAADMISSAO': datetime.datetime(2025, 3, 7, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '006.004.002', 'CODFUNCAO': '000280', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -4947}
{'CODCOLIGADA': 3, 'CHAPA': '052154', 'NOME': 'FABIO DA CONCEICAO MARINHO', 'CPF': '02433442281', 'SECAO': 'LOJA 7 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas Nivel IV', 'DATAADMISSAO': datetime.datetime(2024, 8, 16, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.008', 'CODFUNCAO': '000294', 'SALARIO': Decimal('1838.66'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 14920}
{'CODCOLIGADA': 1, 'CHAPA': '003927', 'NOME': 'FABIO DA COSTA FERREIRA', 'CPF': '01853906255', 'SECAO': 'LOJA 5 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2020, 7, 17, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '005.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 6374}
{'CODCOLIGADA': 2, 'CHAPA': '052562', 'NOME': 'FABIO JUNIOR CAMPOS MACHADO', 'CPF': '04946763295', 'SECAO': 'LOGISTICA OPERACIONAL BR', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2025, 8, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.005', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '051963', 'NOME': 'FABIO JUNIOR RODRIGUES DOS SANTOS', 'CPF': '54422957287', 'SECAO': 'LOJA 10 LOGISTICA ', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2024, 7, 1, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '010.001.003', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1780.00'), 'CODSINDICATO': '05', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -903}
{'CODCOLIGADA': 1, 'CHAPA': '005729', 'NOME': 'FABIO LIMA SILVA', 'CPF': '74343610268', 'SECAO': 'LOJA 9 OPERACIONAL', 'FUNCAO': 'Repositor de mercadorias Nivel VI', 'DATAADMISSAO': datetime.datetime(2021, 12, 20, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '009.001.002', 'CODFUNCAO': '000320', 'SALARIO': Decimal('2043.00'), 'CODSINDICATO': '03', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -1313}
{'CODCOLIGADA': 1, 'CHAPA': '003454', 'NOME': 'FABIO LUIZ LEAL SALDANHA', 'CPF': '68705972272', 'SECAO': 'LOJA 3 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2021, 8, 5, 0, 0), 'CODSITUACAO': 'F', 'CODSECAO': '003.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 76}
{'CODCOLIGADA': 2, 'CHAPA': '051820', 'NOME': 'FABRICIO JOSE PEREIRA FALCAO', 'CPF': '91714524272', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Encarregado de Logistica Nivel I', 'DATAADMISSAO': datetime.datetime(2024, 1, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.003', 'CODFUNCAO': '000259', 'SALARIO': Decimal('1930.60'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '051504', 'NOME': 'FABRICIO JUNIOR CORREA SANTA ROSA', 'CPF': '01617228222', 'SECAO': 'LOJA 4 OPERACIONAL', 'FUNCAO': 'Auxiliar de Reposição', 'DATAADMISSAO': datetime.datetime(2022, 10, 19, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '004.001.002', 'CODFUNCAO': '000327', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -259}
{'CODCOLIGADA': 2, 'CHAPA': '044998', 'NOME': 'FABRICIO MONTEIRO DE ALMEIDA', 'CPF': '59825596287', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Motorista Nivel I', 'DATAADMISSAO': datetime.datetime(2022, 10, 10, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000161', 'SALARIO': Decimal('2163.23'), 'CODSINDICATO': '02', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 2198}
{'CODCOLIGADA': 2, 'CHAPA': '052389', 'NOME': 'FABRICIO RODRIGUES LOUZEIRO', 'CPF': '88276414249', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2025, 2, 3, 0, 0), 'CODSITUACAO': 'V', 'CODSECAO': '001.004.003', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -1760}
{'CODCOLIGADA': 3, 'CHAPA': '052602', 'NOME': 'FELIPE ARAUJO CAMELO', 'CPF': '54605199268', 'SECAO': 'DTI', 'FUNCAO': 'Analista de T.I.', 'DATAADMISSAO': datetime.datetime(2025, 10, 25, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.014', 'CODFUNCAO': '000130', 'SALARIO': Decimal('2085.05'), 'CODSINDICATO': '01', 'INICIOPER': None, 'FIMPER': None, 'SALDO_MINUTOS': None}
{'CODCOLIGADA': 5, 'CHAPA': '006', 'NOME': 'FELIPE DE ANDRADE BATISTA', 'CPF': '90884434249', 'SECAO': 'DTI', 'FUNCAO': 'Gerente de Projetos', 'DATAADMISSAO': datetime.datetime(2023, 5, 1, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '1.02', 'CODFUNCAO': '000340', 'SALARIO': Decimal('10000.00'), 'CODSINDICATO': '01', 'INICIOPER': None, 'FIMPER': None, 'SALDO_MINUTOS': None}
{'CODCOLIGADA': 3, 'CHAPA': '051975', 'NOME': 'FELIPE MACEDO DINIZ', 'CPF': '03875486293', 'SECAO': 'LOJA 7 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas Nivel IV', 'DATAADMISSAO': datetime.datetime(2024, 6, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.008', 'CODFUNCAO': '000294', 'SALARIO': Decimal('1838.66'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 19351}
{'CODCOLIGADA': 2, 'CHAPA': '052308', 'NOME': 'FELIPE MONTEIRO DA SILVA', 'CPF': '84204796249', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Assistente de Logistica Nivel I', 'DATAADMISSAO': datetime.datetime(2024, 11, 18, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.003', 'CODFUNCAO': '000238', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '026126', 'NOME': 'FERNANDA CLARA FERNANDO COELHO', 'CPF': '02685790241', 'SECAO': 'LOJA 7 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas Nivel IV', 'DATAADMISSAO': datetime.datetime(2022, 1, 13, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '007.001.002', 'CODFUNCAO': '000294', 'SALARIO': Decimal('1838.66'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 1218}
{'CODCOLIGADA': 2, 'CHAPA': '052338', 'NOME': 'FERNANDO ALVES DAS MERCES', 'CPF': '45070555200', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Assistente de Logistica Nivel I', 'DATAADMISSAO': datetime.datetime(2024, 12, 16, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.003', 'CODFUNCAO': '000238', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 2, 'CHAPA': '044944', 'NOME': 'FERNANDO ANDRADE DA SILVA', 'CPF': '76184960210', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Operador de Empilhadeira Nivel III', 'DATAADMISSAO': datetime.datetime(2022, 4, 1, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.003', 'CODFUNCAO': '000056', 'SALARIO': Decimal('2165.24'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '052615', 'NOME': 'FERNANDO SANTOS DA COSTA', 'CPF': '02957765284', 'SECAO': 'LOJA 1 OPERACIONAL', 'FUNCAO': 'Auxiliar de Estoque Nivel I', 'DATAADMISSAO': datetime.datetime(2025, 11, 14, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.002', 'CODFUNCAO': '000280', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -117}
{'CODCOLIGADA': 2, 'CHAPA': '052330', 'NOME': 'FLAVIO HENRIQUE REIS DA COSTA', 'CPF': '06506497297', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2024, 12, 16, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '051653', 'NOME': 'FLAVIO MORAES MARQUES', 'CPF': '03224011270', 'SECAO': 'LOJA 1 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2023, 6, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -6836}
{'CODCOLIGADA': 1, 'CHAPA': '026135', 'NOME': 'FRANCILENE MIRANDA CALDAS', 'CPF': '70390983268', 'SECAO': 'LOJA 7 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas Nivel IV', 'DATAADMISSAO': datetime.datetime(2022, 6, 1, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '007.001.002', 'CODFUNCAO': '000294', 'SALARIO': Decimal('1838.66'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 13223}
{'CODCOLIGADA': 2, 'CHAPA': '052263', 'NOME': 'FRANCISCO DE ASSIS VIEIRA SOUZA', 'CPF': '25260391349', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2024, 11, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.003', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 2, 'CHAPA': '051758', 'NOME': 'FRANCISCO DE MELO COSTA', 'CPF': '94621640291', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Motorista Nivel I', 'DATAADMISSAO': datetime.datetime(2023, 10, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000161', 'SALARIO': Decimal('2163.23'), 'CODSINDICATO': '02', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '003949', 'NOME': 'FRANCISCO DOS SANTOS FEITOSA', 'CPF': '01987600274', 'SECAO': 'LOJA 5 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2021, 10, 14, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '005.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 253}
{'CODCOLIGADA': 2, 'CHAPA': '051888', 'NOME': 'FRANCISCO NATALINO BEZERRA SANTOS', 'CPF': '84799099353', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2024, 4, 15, 0, 0), 'CODSITUACAO': 'P', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '036144', 'NOME': 'FRANCIVALDO LIMA NOBRE', 'CPF': '97942634272', 'SECAO': 'LOJA 4 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2020, 3, 11, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '004.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 2464}
{'CODCOLIGADA': 1, 'CHAPA': '051655', 'NOME': 'FRANK NELSON BOA MORTE', 'CPF': '20562780220', 'SECAO': 'LOJA 8 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2023, 6, 5, 0, 0), 'CODSITUACAO': 'F', 'CODSECAO': '008.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 852}
{'CODCOLIGADA': 1, 'CHAPA': '052378', 'NOME': 'FRANSUELEN MONTEIRO DA SILVA', 'CPF': '01538988283', 'SECAO': 'LOJA 3 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2025, 2, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '003.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -1668}
{'CODCOLIGADA': 1, 'CHAPA': '026132', 'NOME': 'FREDSON CRISTIAN VASCONCELOS SANTOS', 'CPF': '65160118268', 'SECAO': 'LOGISTICA ESTOQUE', 'FUNCAO': 'Assistente de Estoque IV', 'DATAADMISSAO': datetime.datetime(2022, 5, 13, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '006.003.013', 'CODFUNCAO': '000282', 'SALARIO': Decimal('1838.66'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 5625}
{'CODCOLIGADA': 1, 'CHAPA': '052630', 'NOME': 'GABRIEL DA COSTA BATISTA', 'CPF': '02206867265', 'SECAO': 'DTI', 'FUNCAO': 'APRENDIZ', 'DATAADMISSAO': datetime.datetime(2026, 1, 7, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '006.003.005', 'CODFUNCAO': '000038', 'SALARIO': Decimal('761.55'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '052351', 'NOME': 'GABRIEL DE JESUS FIEL', 'CPF': '05269287277', 'SECAO': 'LOJA 5 OPERACIONAL', 'FUNCAO': 'APRENDIZ', 'DATAADMISSAO': datetime.datetime(2025, 1, 6, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '005.001.002', 'CODFUNCAO': '000038', 'SALARIO': Decimal('761.55'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -264}
{'CODCOLIGADA': 3, 'CHAPA': '052492', 'NOME': 'GABRIEL FARIAS DA PAIXAO', 'CPF': '06195926213', 'SECAO': 'DTI', 'FUNCAO': 'Analista de T.I.', 'DATAADMISSAO': datetime.datetime(2025, 5, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.014', 'CODFUNCAO': '000130', 'SALARIO': Decimal('2085.05'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -480}
{'CODCOLIGADA': 1, 'CHAPA': '052341', 'NOME': 'GABRIEL FONTEL DA SILVA', 'CPF': '08234017233', 'SECAO': 'LOJA 9 OPERACIONAL', 'FUNCAO': 'Servicos Gerais', 'DATAADMISSAO': datetime.datetime(2024, 12, 17, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '009.001.002', 'CODFUNCAO': '000059', 'SALARIO': Decimal('1750.00'), 'CODSINDICATO': '03', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -7560}
{'CODCOLIGADA': 3, 'CHAPA': '052436', 'NOME': 'GABRIEL OLIVEIRA DOS SANTOS', 'CPF': '04468004223', 'SECAO': 'SEGURANCA PATRIMONIAL', 'FUNCAO': 'Monitor de sistemas de segurança interno', 'DATAADMISSAO': datetime.datetime(2025, 2, 18, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.003', 'CODFUNCAO': '000073', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 3729}
{'CODCOLIGADA': 1, 'CHAPA': '052122', 'NOME': 'GABRIEL SANDE MEIRELES', 'CPF': '06976789200', 'SECAO': 'LOJA 9 OPERACIONAL', 'FUNCAO': 'APRENDIZ', 'DATAADMISSAO': datetime.datetime(2024, 8, 12, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '009.001.002', 'CODFUNCAO': '000038', 'SALARIO': Decimal('761.55'), 'CODSINDICATO': '03', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -3}
{'CODCOLIGADA': 1, 'CHAPA': '052456', 'NOME': 'GABRIEL SOARES DE SOUZA', 'CPF': '03008461263', 'SECAO': 'LOJA 10 LOGISTICA ', 'FUNCAO': 'Motorista Nivel I', 'DATAADMISSAO': datetime.datetime(2025, 3, 19, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '010.001.003', 'CODFUNCAO': '000161', 'SALARIO': Decimal('2163.23'), 'CODSINDICATO': '05', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -2548}
{'CODCOLIGADA': 2, 'CHAPA': '052145', 'NOME': 'GAIIEL MIRANDA DE BRITO', 'CPF': '05947673266', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2024, 8, 16, 0, 0), 'CODSITUACAO': 'F', 'CODSECAO': '001.004.003', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -440}
{'CODCOLIGADA': 3, 'CHAPA': '052442', 'NOME': 'GEANE MARCELA ROCHA DE JESUS', 'CPF': '71532650230', 'SECAO': 'SEGURANCA PATRIMONIAL', 'FUNCAO': 'Fiscal de Loja', 'DATAADMISSAO': datetime.datetime(2025, 3, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.003', 'CODFUNCAO': '000116', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 496}
{'CODCOLIGADA': 1, 'CHAPA': '051578', 'NOME': 'GENIVALDO DA SILVA SOUSA', 'CPF': '84316292234', 'SECAO': 'LOJA 9 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas Nivel VI', 'DATAADMISSAO': datetime.datetime(2023, 2, 15, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '009.001.002', 'CODFUNCAO': '000313', 'SALARIO': Decimal('2043.00'), 'CODSINDICATO': '03', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 1632}
{'CODCOLIGADA': 1, 'CHAPA': '051878', 'NOME': 'GEOVANE SOUZA SILVA', 'CPF': '03178886257', 'SECAO': 'LOJA 9 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas Nivel VI', 'DATAADMISSAO': datetime.datetime(2024, 4, 15, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '009.001.002', 'CODFUNCAO': '000313', 'SALARIO': Decimal('2043.00'), 'CODSINDICATO': '03', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -2073}
{'CODCOLIGADA': 1, 'CHAPA': '051954', 'NOME': 'GEOVANNE CARDOSO RODRIGUES', 'CPF': '04067876203', 'SECAO': 'LOJA 10 OPERACIONAL', 'FUNCAO': 'Auxiliar de Reposição', 'DATAADMISSAO': datetime.datetime(2024, 7, 1, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '010.001.002', 'CODFUNCAO': '000327', 'SALARIO': Decimal('1780.00'), 'CODSINDICATO': '05', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 5635}
{'CODCOLIGADA': 2, 'CHAPA': '052361', 'NOME': 'GERLANE OLIVEIRA MELO', 'CPF': '87909979215', 'SECAO': 'COMPRAS', 'FUNCAO': 'Analista de Compras III', 'DATAADMISSAO': datetime.datetime(2025, 1, 15, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.003.006', 'CODFUNCAO': '000400', 'SALARIO': Decimal('2251.85'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 1073}
{'CODCOLIGADA': 2, 'CHAPA': '051881', 'NOME': 'GILBERTO TRINDADE DE OLIVEIRA', 'CPF': '77527739215', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Motorista Nivel II', 'DATAADMISSAO': datetime.datetime(2024, 4, 16, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000284', 'SALARIO': Decimal('2787.22'), 'CODSINDICATO': '02', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 2, 'CHAPA': '044903', 'NOME': 'GILVANDO ALEXANDRINO MENDES', 'CPF': '92479855287', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Supervisor de logística Nivel II', 'DATAADMISSAO': datetime.datetime(2021, 11, 1, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.003', 'CODFUNCAO': '000261', 'SALARIO': Decimal('2724.51'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 3, 'CHAPA': '052587', 'NOME': 'GISELY DE ALMEIDA DAMASCENO DE SOUSA', 'CPF': '07551566252', 'SECAO': 'GENTE E GESTAO', 'FUNCAO': 'Estagiario Gente e Gestao', 'DATAADMISSAO': datetime.datetime(2025, 9, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.009', 'CODFUNCAO': '000385', 'SALARIO': Decimal('600.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -169}
{'CODCOLIGADA': 1, 'CHAPA': '052349', 'NOME': 'GLAUCO SULIVAN CORREA COSTA', 'CPF': '02039482202', 'SECAO': 'LOJA 2 OPERACIONAL', 'FUNCAO': 'APRENDIZ', 'DATAADMISSAO': datetime.datetime(2025, 1, 6, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '002.001.002', 'CODFUNCAO': '000038', 'SALARIO': Decimal('761.55'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -1226}
{'CODCOLIGADA': 1, 'CHAPA': '052438', 'NOME': 'GLAYCE HELLEN SILVA MORAIS', 'CPF': '83758372291', 'SECAO': 'LOJA 2 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2025, 2, 17, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '002.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 5479}
{'CODCOLIGADA': 1, 'CHAPA': '052377', 'NOME': 'GLEIDSON JOSE DE OLIVEIRA ROCHA', 'CPF': '88149331204', 'SECAO': 'LOJA 1 OPERACIONAL', 'FUNCAO': 'Auxiliar de Estoque Nivel I', 'DATAADMISSAO': datetime.datetime(2025, 2, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.002', 'CODFUNCAO': '000280', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 8335}
{'CODCOLIGADA': 1, 'CHAPA': '051436', 'NOME': 'GLEMILSON PEREIRA GOMES', 'CPF': '70390605239', 'SECAO': 'LOJA 8 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2021, 7, 12, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '008.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 1797}
{'CODCOLIGADA': 1, 'CHAPA': '052044', 'NOME': 'GLEYDSON GIL GUIMARAES COSTA', 'CPF': '01886587264', 'SECAO': 'LOJA 4 OPERACIONAL', 'FUNCAO': 'Auxiliar de Reposição', 'DATAADMISSAO': datetime.datetime(2024, 7, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '004.001.002', 'CODFUNCAO': '000327', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -1911}
{'CODCOLIGADA': 3, 'CHAPA': '052412', 'NOME': 'GRAZIELLE LOHANA DE MELO DA SILVA', 'CPF': '07027999200', 'SECAO': 'LOJA 7 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas Nivel IV', 'DATAADMISSAO': datetime.datetime(2025, 2, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.008', 'CODFUNCAO': '000294', 'SALARIO': Decimal('1838.66'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -5019}
{'CODCOLIGADA': 1, 'CHAPA': '052447', 'NOME': 'GUSTAVO COSTA RODRIGUES', 'CPF': '07416586232', 'SECAO': 'LOGISTICA OPERACIONAL BR', 'FUNCAO': 'Auxiliar de Estoque Nivel I', 'DATAADMISSAO': datetime.datetime(2025, 3, 7, 0, 0), 'CODSITUACAO': 'V', 'CODSECAO': '006.004.002', 'CODFUNCAO': '000280', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 98}
{'CODCOLIGADA': 1, 'CHAPA': '052554', 'NOME': 'GUSTAVO HENRIQUE NOVAES BRANCO', 'CPF': '00672594218', 'SECAO': 'LOJA 5 OPERACIONAL', 'FUNCAO': 'Operador de Caixa', 'DATAADMISSAO': datetime.datetime(2025, 7, 16, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '005.001.002', 'CODFUNCAO': '000042', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 4980}
{'CODCOLIGADA': 3, 'CHAPA': '052363', 'NOME': 'HAELJA PATRICIA SANTOS BATISTA', 'CPF': '01653102276', 'SECAO': 'SEGURANCA PATRIMONIAL', 'FUNCAO': 'Fiscal de Loja', 'DATAADMISSAO': datetime.datetime(2025, 1, 15, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.003', 'CODFUNCAO': '000116', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 4568}
{'CODCOLIGADA': 2, 'CHAPA': '052613', 'NOME': 'HAMILTON REIS DA SILVA', 'CPF': '05962836286', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2025, 11, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 2, 'CHAPA': '052197', 'NOME': 'HARLEM ANDREY PARENTE CRISTO', 'CPF': '61387908200', 'SECAO': 'LOGISTICA SUPPLY', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2024, 10, 7, 0, 0), 'CODSITUACAO': 'F', 'CODSECAO': '001.004.006', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 2, 'CHAPA': '052117', 'NOME': 'HELTON SOUZA CORREA', 'CPF': '04160867219', 'SECAO': 'LOGISTICA OPERACIONAL BR', 'FUNCAO': 'Assistente de Logistica Nivel IV', 'DATAADMISSAO': datetime.datetime(2024, 7, 26, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.005', 'CODFUNCAO': '000257', 'SALARIO': Decimal('1838.66'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 2, 'CHAPA': '052304', 'NOME': 'HENRIQUE DA SILVA TRINDADE', 'CPF': '05069330241', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2024, 11, 18, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.003', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '051938', 'NOME': 'HIGOR RODRIGUES E SILVA', 'CPF': '00797371290', 'SECAO': 'LOJA 10 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2024, 7, 1, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '010.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '05', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 11928}
{'CODCOLIGADA': 1, 'CHAPA': '051455', 'NOME': 'HILDA MARIA PINHEIRO DE SOUZA SOARES', 'CPF': '85243000272', 'SECAO': 'LOJA 4 OPERACIONAL', 'FUNCAO': 'Servicos Gerais', 'DATAADMISSAO': datetime.datetime(2022, 6, 21, 0, 0), 'CODSITUACAO': 'P', 'CODSECAO': '004.001.002', 'CODFUNCAO': '000059', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '003633', 'NOME': 'HUGO RAFAEL LIMA E SILVA', 'CPF': '88542823249', 'SECAO': 'LOJA 4 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2017, 11, 14, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '004.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 3959}
{'CODCOLIGADA': 1, 'CHAPA': '003461', 'NOME': 'IDELMAR NONATO CONCEIÇÃO MACEDO', 'CPF': '53390318291', 'SECAO': 'LOJA 3 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2021, 11, 17, 0, 0), 'CODSITUACAO': 'F', 'CODSECAO': '003.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 8239}
{'CODCOLIGADA': 2, 'CHAPA': '051641', 'NOME': 'IGHOR COSTA ALVES CAMARA', 'CPF': '05293736299', 'SECAO': 'SEGURANCA PATRIMONIAL', 'FUNCAO': 'Fiscal de Loja', 'DATAADMISSAO': datetime.datetime(2023, 5, 16, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.003.010', 'CODFUNCAO': '000116', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 2271}
{'CODCOLIGADA': 1, 'CHAPA': '051643', 'NOME': 'IGOR JOSE MESCOUTO DOS SANTOS', 'CPF': '01412923263', 'SECAO': 'LOJA 4 OPERACIONAL', 'FUNCAO': 'Operador de Caixa', 'DATAADMISSAO': datetime.datetime(2023, 5, 16, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '004.001.002', 'CODFUNCAO': '000042', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 9213}
{'CODCOLIGADA': 2, 'CHAPA': '044900', 'NOME': 'IGOR LEONARDO PINTO LEMOS DA SILVA', 'CPF': '01681637219', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Motorista Nivel II', 'DATAADMISSAO': datetime.datetime(2021, 10, 1, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000284', 'SALARIO': Decimal('2787.22'), 'CODSINDICATO': '02', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 3, 'CHAPA': '051752', 'NOME': 'INGREDY NASCIMENTO DA SILVA', 'CPF': '03046430256', 'SECAO': 'MARKETING', 'FUNCAO': 'Analista de Marketing Nivel VI', 'DATAADMISSAO': datetime.datetime(2023, 10, 5, 0, 0), 'CODSITUACAO': 'F', 'CODSECAO': '001.001.004', 'CODFUNCAO': '000424', 'SALARIO': Decimal('2862.94'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -63}
{'CODCOLIGADA': 1, 'CHAPA': '052121', 'NOME': 'INGRID JOICE AMANAJAS MARINHO', 'CPF': '70102941270', 'SECAO': 'LOJA 4 OPERACIONAL', 'FUNCAO': 'ASSISTENTE DE CREDITO', 'DATAADMISSAO': datetime.datetime(2024, 8, 1, 0, 0), 'CODSITUACAO': 'F', 'CODSECAO': '004.001.002', 'CODFUNCAO': '000134', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 17615}
{'CODCOLIGADA': 1, 'CHAPA': '051500', 'NOME': 'INGRID MAYARA DE SOUZA ABREU', 'CPF': '07223341254', 'SECAO': 'LOJA 3 OPERACIONAL', 'FUNCAO': 'Operador de Caixa', 'DATAADMISSAO': datetime.datetime(2022, 10, 10, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '003.001.002', 'CODFUNCAO': '000042', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 2896}
{'CODCOLIGADA': 1, 'CHAPA': '051813', 'NOME': 'IRA WALDIR DAMASCENO DOS SANTOS', 'CPF': '41094077291', 'SECAO': 'COMERCIAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2024, 1, 1, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '006.003.014', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1926.49'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -1038}
{'CODCOLIGADA': 1, 'CHAPA': '052428', 'NOME': 'IRANILSON MACEDO DE SOUZA', 'CPF': '68382219268', 'SECAO': 'LOJA 9 OPERACIONAL', 'FUNCAO': 'Servicos Gerais', 'DATAADMISSAO': datetime.datetime(2025, 2, 10, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '009.001.002', 'CODFUNCAO': '000059', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '03', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -6362}
{'CODCOLIGADA': 2, 'CHAPA': '052391', 'NOME': 'IRIVALDO LEAL DIAS', 'CPF': '75298520278', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2025, 2, 3, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.003', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 3, 'CHAPA': '051821', 'NOME': 'ISABEL CRISTINY BORGES DOS SANTOS', 'CPF': '01534678271', 'SECAO': 'GENTE E GESTAO', 'FUNCAO': 'Supervisor(a) de Gente e Gestao', 'DATAADMISSAO': datetime.datetime(2024, 1, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.009', 'CODFUNCAO': '000388', 'SALARIO': Decimal('4061.48'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 6887}
{'CODCOLIGADA': 1, 'CHAPA': '051439', 'NOME': 'ISABELA CRISTINA AFONSO CANTAO COSTA', 'CPF': '02388504201', 'SECAO': 'SEGURANCA PATRIMONIAL', 'FUNCAO': 'Fiscal de Loja', 'DATAADMISSAO': datetime.datetime(2021, 7, 12, 0, 0), 'CODSITUACAO': 'F', 'CODSECAO': '006.003.010', 'CODFUNCAO': '000116', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 2540}
{'CODCOLIGADA': 1, 'CHAPA': '052184', 'NOME': 'ISABELLE RAMOS EVANGELISTA', 'CPF': '07293865201', 'SECAO': 'LOJA 4 OPERACIONAL', 'FUNCAO': 'ASSISTENTE DE CREDITO', 'DATAADMISSAO': datetime.datetime(2024, 10, 7, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '004.001.002', 'CODFUNCAO': '000134', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 3129}
{'CODCOLIGADA': 1, 'CHAPA': '003915', 'NOME': 'ISADORA LAVOR DINIZ', 'CPF': '00960122265', 'SECAO': 'LOJA 4 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2020, 3, 17, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '004.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 1909}
{'CODCOLIGADA': 1, 'CHAPA': '052253', 'NOME': 'ISAIAS COUTO OLIVEIRA', 'CPF': '02541632207', 'SECAO': 'LOJA 10 LOGISTICA ', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2024, 10, 21, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '010.001.003', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1780.00'), 'CODSINDICATO': '05', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -2128}
{'CODCOLIGADA': 2, 'CHAPA': '052625', 'NOME': 'ISAIAS DE CASTRO COSTA', 'CPF': '00969069286', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2026, 1, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 5, 'CHAPA': '020', 'NOME': 'IVE MOUSINHO RISUENHO BATISTA', 'CPF': '78827221204', 'SECAO': 'GENTE E GESTAO', 'FUNCAO': 'Psicologo(a)', 'DATAADMISSAO': datetime.datetime(2024, 12, 1, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '1.07', 'CODFUNCAO': '000401', 'SALARIO': Decimal('4000.00'), 'CODSINDICATO': '01', 'INICIOPER': None, 'FIMPER': None, 'SALDO_MINUTOS': None}
{'CODCOLIGADA': 1, 'CHAPA': '051649', 'NOME': 'IZAC TEODORO DOS PASSOS', 'CPF': '06983125207', 'SECAO': 'COMERCIAL', 'FUNCAO': 'Operador de Caixa', 'DATAADMISSAO': datetime.datetime(2023, 5, 18, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '006.003.014', 'CODFUNCAO': '000042', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -1686}
{'CODCOLIGADA': 2, 'CHAPA': '051819', 'NOME': 'IZAIAS LEAO GONCALVES', 'CPF': '81226918204', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2024, 1, 5, 0, 0), 'CODSITUACAO': 'P', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 2, 'CHAPA': '052418', 'NOME': 'IZAQUE RODRIGUES BARBOZA', 'CPF': '07740854280', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Assistente de Logistica Nivel IV', 'DATAADMISSAO': datetime.datetime(2025, 2, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.003', 'CODFUNCAO': '000257', 'SALARIO': Decimal('1838.66'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '052590', 'NOME': 'JACKELINE RODRIGUES CARDOSO DA SILVA', 'CPF': '88566315200', 'SECAO': 'LOJA 4 OPERACIONAL', 'FUNCAO': 'Servicos Gerais', 'DATAADMISSAO': datetime.datetime(2025, 10, 6, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '004.001.002', 'CODFUNCAO': '000059', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 513}
{'CODCOLIGADA': 2, 'CHAPA': '051597', 'NOME': 'JADILSON ARAUJO', 'CPF': '94836710278', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2023, 3, 13, 0, 0), 'CODSITUACAO': 'F', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 2, 'CHAPA': '052569', 'NOME': 'JADSON NAZARENO PRESTES CHAVES', 'CPF': '06374297296', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2025, 8, 11, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -22}
{'CODCOLIGADA': 1, 'CHAPA': '036121', 'NOME': 'JAILSON DE SOUSA', 'CPF': '28724429287', 'SECAO': 'LOJA 4 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2020, 8, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '004.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 6184}
{'CODCOLIGADA': 2, 'CHAPA': '051570', 'NOME': 'JAILSON MOREIRA', 'CPF': '79119077220', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Motorista Nivel II', 'DATAADMISSAO': datetime.datetime(2022, 11, 14, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000284', 'SALARIO': Decimal('2787.22'), 'CODSINDICATO': '02', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '002672', 'NOME': 'JAILTON OLIVEIRA DA COSTA', 'CPF': '00320295273', 'SECAO': 'LOJA 1 OPERACIONAL', 'FUNCAO': 'Embalador', 'DATAADMISSAO': datetime.datetime(2020, 6, 15, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.002', 'CODFUNCAO': '000075', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 4802}
{'CODCOLIGADA': 2, 'CHAPA': '052156', 'NOME': 'JAIRO FERREIRA BOTELHO', 'CPF': '68742177200', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2024, 9, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 3, 'CHAPA': '052507', 'NOME': 'JAISON HERIKIS GARCIA CAVALCANTE', 'CPF': '03203807262', 'SECAO': 'SEGURANCA PATRIMONIAL', 'FUNCAO': 'Fiscal de Loja', 'DATAADMISSAO': datetime.datetime(2025, 5, 15, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.003', 'CODFUNCAO': '000116', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 315}
{'CODCOLIGADA': 2, 'CHAPA': '052626', 'NOME': 'JAKSON RIBEIRO DE BRITO', 'CPF': '98748386200', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2026, 1, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '003435', 'NOME': 'JAMILE PONCIANO VASCONCELOS', 'CPF': '59393025215', 'SECAO': 'LOJA 3 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2020, 7, 21, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '003.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 21476}
{'CODCOLIGADA': 1, 'CHAPA': '051875', 'NOME': 'JANICE CRISTINA DE SOUSA SILVA', 'CPF': '68977255287', 'SECAO': 'LOJA 4 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2024, 4, 15, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '004.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 5997}
{'CODCOLIGADA': 1, 'CHAPA': '051834', 'NOME': 'JANILSON DOS SANTOS SANTIAGO', 'CPF': '01717492274', 'SECAO': 'LOJA 1 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2024, 1, 18, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 16026}
{'CODCOLIGADA': 1, 'CHAPA': '003346', 'NOME': 'JAQUELINE OLIVEIRA RIBEIRO', 'CPF': '98927272234', 'SECAO': 'LOJA 2 OPERACIONAL', 'FUNCAO': 'Operador de Caixa', 'DATAADMISSAO': datetime.datetime(2019, 6, 6, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '002.001.002', 'CODFUNCAO': '000163', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 9374}
{'CODCOLIGADA': 2, 'CHAPA': '044994', 'NOME': 'JARDSON DIAS SILVA', 'CPF': '00996208208', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Motorista Nivel I', 'DATAADMISSAO': datetime.datetime(2022, 9, 28, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000161', 'SALARIO': Decimal('2163.23'), 'CODSINDICATO': '02', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '052243', 'NOME': 'JEAN CARLOS DE MESQUITA FERREIRA', 'CPF': '26231166287', 'SECAO': 'LOJA 3 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2024, 10, 11, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '003.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 2673}
{'CODCOLIGADA': 1, 'CHAPA': '051661', 'NOME': 'JEAN FRANKY LOPES', 'CPF': '02035403286', 'SECAO': 'LOJA 1 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2023, 6, 12, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 6477}
{'CODCOLIGADA': 1, 'CHAPA': '051832', 'NOME': 'JEFFERSON MARIANO VAZ MARQUES', 'CPF': '75225093272', 'SECAO': 'LOJA 3 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2024, 1, 18, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '003.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 11739}
{'CODCOLIGADA': 2, 'CHAPA': '052240', 'NOME': 'JEFFERSON NASCIMENTO PEREIRA', 'CPF': '00196578205', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Motorista Nivel I', 'DATAADMISSAO': datetime.datetime(2024, 10, 11, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000161', 'SALARIO': Decimal('2163.23'), 'CODSINDICATO': '02', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -2348}
{'CODCOLIGADA': 1, 'CHAPA': '051537', 'NOME': 'JEOVANA DA SILVA BRITO', 'CPF': '07882878260', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Assistente de Logistica Nivel V', 'DATAADMISSAO': datetime.datetime(2022, 12, 13, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '006.004.004', 'CODFUNCAO': '000425', 'SALARIO': Decimal('1930.59'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '051644', 'NOME': 'JHENNYFER KARYNNE DA SILVA SOUSA', 'CPF': '02570376248', 'SECAO': 'LOJA 4 OPERACIONAL', 'FUNCAO': 'ASSISTENTE DE CREDITO', 'DATAADMISSAO': datetime.datetime(2023, 5, 16, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '004.001.002', 'CODFUNCAO': '000134', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 15099}
{'CODCOLIGADA': 1, 'CHAPA': '036133', 'NOME': 'JHONATA ALEF MATOS CAMPOS', 'CPF': '02324990202', 'SECAO': 'LOJA 4 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2019, 8, 7, 0, 0), 'CODSITUACAO': 'F', 'CODSECAO': '004.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 3952}
{'CODCOLIGADA': 2, 'CHAPA': '051558', 'NOME': 'JHONATAS CARRERA DUTRA', 'CPF': '01954370202', 'SECAO': 'LOGISTICA OPERACIONAL BR', 'FUNCAO': 'Operador de Empilhadeira Nivel III', 'DATAADMISSAO': datetime.datetime(2023, 1, 2, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.005', 'CODFUNCAO': '000056', 'SALARIO': Decimal('2165.24'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -440}
{'CODCOLIGADA': 2, 'CHAPA': '052102', 'NOME': 'JHONATHAN GABRIEL LIBONATI BARBOSA', 'CPF': '05888417220', 'SECAO': 'LOGISTICA SUPPLY', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2024, 7, 26, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.006', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 3, 'CHAPA': '052272', 'NOME': 'JHONE ALVES DA COSTA', 'CPF': '01776793366', 'SECAO': 'SEGURANCA PATRIMONIAL', 'FUNCAO': 'Fiscal de loja Nivel VI', 'DATAADMISSAO': datetime.datetime(2024, 11, 18, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.003', 'CODFUNCAO': '000318', 'SALARIO': Decimal('2043.00'), 'CODSINDICATO': '03', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 815}
{'CODCOLIGADA': 1, 'CHAPA': '002639', 'NOME': 'JOAO ANDERSON COUTO MALATO', 'CPF': '86395165291', 'SECAO': 'LOJA 1 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2018, 9, 1, 0, 0), 'CODSITUACAO': 'F', 'CODSECAO': '001.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 5145}
{'CODCOLIGADA': 1, 'CHAPA': '003339', 'NOME': 'JOAO BATISTA CARVALHO DE PAULA', 'CPF': '70753636204', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Motorista Nivel II', 'DATAADMISSAO': datetime.datetime(2018, 5, 8, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '006.004.001', 'CODFUNCAO': '000284', 'SALARIO': Decimal('2787.22'), 'CODSINDICATO': '02', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 775}
{'CODCOLIGADA': 1, 'CHAPA': '051626', 'NOME': 'JOAO BATISTA MIRANDA SILVA', 'CPF': '15918890220', 'SECAO': 'LOJA 4 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2023, 5, 2, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '004.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 1937}
{'CODCOLIGADA': 2, 'CHAPA': '044150', 'NOME': 'JOAO BATISTA RIBEIRO PANTOJA', 'CPF': '90766229220', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Motorista Nivel II', 'DATAADMISSAO': datetime.datetime(2021, 5, 24, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000284', 'SALARIO': Decimal('2787.22'), 'CODSINDICATO': '02', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '052604', 'NOME': 'JOAO FERREIRA DOS REIS JUNIOR', 'CPF': '79303870204', 'SECAO': 'SEGURANCA PATRIMONIAL', 'FUNCAO': 'Fiscal de Loja', 'DATAADMISSAO': datetime.datetime(2025, 11, 1, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '010.001.004', 'CODFUNCAO': '000116', 'SALARIO': Decimal('1780.00'), 'CODSINDICATO': '05', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 2680}
{'CODCOLIGADA': 2, 'CHAPA': '051883', 'NOME': 'JOAO PAULO DE ARAUJO COSTA', 'CPF': '84403845215', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Motorista Nivel I', 'DATAADMISSAO': datetime.datetime(2024, 4, 16, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000161', 'SALARIO': Decimal('2163.23'), 'CODSINDICATO': '02', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 2, 'CHAPA': '052628', 'NOME': 'JOAO PAULO NOGUEIRA DO ESPIRITO SANTO', 'CPF': '71363359223', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2026, 1, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '051695', 'NOME': 'JOAO PAULO XIMENDES DA SILVA', 'CPF': '72044055287', 'SECAO': 'LOJA 9 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas Nivel VI', 'DATAADMISSAO': datetime.datetime(2023, 8, 16, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '009.001.002', 'CODFUNCAO': '000313', 'SALARIO': Decimal('2043.00'), 'CODSINDICATO': '03', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 1386}
{'CODCOLIGADA': 3, 'CHAPA': '051662', 'NOME': 'JOAO RAMOS BATISTA', 'CPF': '02223436218', 'SECAO': 'EXPANSAO E MANUTENCAO', 'FUNCAO': 'Eletricista de Instalações', 'DATAADMISSAO': datetime.datetime(2023, 6, 12, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.001', 'CODFUNCAO': '000182', 'SALARIO': Decimal('2197.46'), 'CODSINDICATO': '04', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -12454}
{'CODCOLIGADA': 2, 'CHAPA': '044922', 'NOME': 'JOAO RICARDO MARREIROS PINTO', 'CPF': '46094474287', 'SECAO': 'SEGURANCA PATRIMONIAL', 'FUNCAO': 'Gerente de Segurança Nivel I', 'DATAADMISSAO': datetime.datetime(2022, 1, 11, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.003.010', 'CODFUNCAO': '000252', 'SALARIO': Decimal('4320.26'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '003940', 'NOME': 'JOAO SANTOS DA MOTA', 'CPF': '40430871287', 'SECAO': 'LOJA 5 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2020, 11, 11, 0, 0), 'CODSITUACAO': 'F', 'CODSECAO': '005.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 2765}
{'CODCOLIGADA': 2, 'CHAPA': '052264', 'NOME': 'JOAO VICTOR DA CONCEICAO DE SOUSA', 'CPF': '08034773255', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2024, 11, 5, 0, 0), 'CODSITUACAO': 'V', 'CODSECAO': '001.004.003', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '052352', 'NOME': 'JOAO VICTOR DE SOUSA COSTA', 'CPF': '02078154296', 'SECAO': 'LOJA 7 OPERACIONAL', 'FUNCAO': 'APRENDIZ', 'DATAADMISSAO': datetime.datetime(2025, 1, 6, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '007.001.002', 'CODFUNCAO': '000038', 'SALARIO': Decimal('761.55'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -1772}
{'CODCOLIGADA': 1, 'CHAPA': '052452', 'NOME': 'JOAO VITOR DA SILVA VENANCIO', 'CPF': '05239245266', 'SECAO': 'LOJA 9 OPERACIONAL', 'FUNCAO': 'Repositor de Mercadoria', 'DATAADMISSAO': datetime.datetime(2025, 3, 17, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '009.001.002', 'CODFUNCAO': '000043', 'SALARIO': Decimal('2043.00'), 'CODSINDICATO': '03', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -1620}
{'CODCOLIGADA': 1, 'CHAPA': '052181', 'NOME': 'JOAQUIM DOS ANJOS FERREIRA DA SILVEIRA', 'CPF': '74799355287', 'SECAO': 'LOJA 4 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2024, 9, 24, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '004.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1750.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 10036}
{'CODCOLIGADA': 2, 'CHAPA': '004447', 'NOME': 'JOAQUIM RODRIGO DO NASCIMENTO VALENTIM', 'CPF': '00184660289', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Motorista Nivel I', 'DATAADMISSAO': datetime.datetime(2020, 2, 10, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000161', 'SALARIO': Decimal('2163.23'), 'CODSINDICATO': '02', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 3, 'CHAPA': '052506', 'NOME': 'JOEL SOUZA DOS SANTOS', 'CPF': '86789090215', 'SECAO': 'SEGURANCA PATRIMONIAL', 'FUNCAO': 'Encarregado de Seguranca de Patrimonial', 'DATAADMISSAO': datetime.datetime(2025, 5, 15, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.003', 'CODFUNCAO': '000418', 'SALARIO': Decimal('1930.60'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 6981}
{'CODCOLIGADA': 2, 'CHAPA': '044982', 'NOME': 'JOELMA CARDOSO AMANAJAS', 'CPF': '81151489204', 'SECAO': 'LOGISTICA OPERACIONAL BR', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2022, 7, 25, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.005', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 5261}
{'CODCOLIGADA': 1, 'CHAPA': '003352', 'NOME': 'JOELMA FERREIRA PEREIRA', 'CPF': '76796264215', 'SECAO': 'LOJA 2 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2020, 7, 15, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '002.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 2286}
{'CODCOLIGADA': 3, 'CHAPA': '051870', 'NOME': 'JOELSON DE BRITO RIBEIRO', 'CPF': '70290642167', 'SECAO': 'DTI', 'FUNCAO': 'Analista de T.I.', 'DATAADMISSAO': datetime.datetime(2024, 4, 3, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.014', 'CODFUNCAO': '000130', 'SALARIO': Decimal('3091.98'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '051613', 'NOME': 'JOELSON DE MORAES FERREIRA', 'CPF': '00644164298', 'SECAO': 'LOJA 3 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2023, 4, 3, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '003.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 18679}
{'CODCOLIGADA': 2, 'CHAPA': '044992', 'NOME': 'JOFISO CORREA DE FARIAS', 'CPF': '90605101272', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Motorista Nivel II', 'DATAADMISSAO': datetime.datetime(2022, 9, 28, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000284', 'SALARIO': Decimal('2787.22'), 'CODSINDICATO': '02', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 3, 'CHAPA': '052600', 'NOME': 'JOHN OEY FREIRE DE SOUZA', 'CPF': '78961769200', 'SECAO': 'SEGURANCA PATRIMONIAL', 'FUNCAO': 'Fiscal de Loja', 'DATAADMISSAO': datetime.datetime(2025, 10, 6, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.003', 'CODFUNCAO': '000116', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 873}
{'CODCOLIGADA': 2, 'CHAPA': '051679', 'NOME': 'JOILSON FRANCA DA SILVA', 'CPF': '70005672287', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Operador de Empilhadeira Nivel III', 'DATAADMISSAO': datetime.datetime(2023, 7, 18, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.003', 'CODFUNCAO': '000056', 'SALARIO': Decimal('2165.24'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '003325', 'NOME': 'JONATA DE SOUSA MONTEIRO', 'CPF': '03533925293', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2018, 3, 6, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '006.004.004', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -2252}
{'CODCOLIGADA': 2, 'CHAPA': '052127', 'NOME': 'JONES EDUARDO CORREA SANTA ROSA', 'CPF': '08025232263', 'SECAO': 'LOGISTICA SUPPLY', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2024, 8, 6, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.006', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 2, 'CHAPA': '052387', 'NOME': 'JORGE ARMANDO FARIAS NOGUEIRA', 'CPF': '82572011204', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Operador de Empilhadeira Nivel I', 'DATAADMISSAO': datetime.datetime(2025, 2, 3, 0, 0), 'CODSITUACAO': 'V', 'CODSECAO': '001.004.003', 'CODFUNCAO': '000377', 'SALARIO': Decimal('2085.05'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 2, 'CHAPA': '051573', 'NOME': 'JORGE LUIS MEDEIROS MENDES', 'CPF': '02425200223', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Assistente de Logistica Nivel IV', 'DATAADMISSAO': datetime.datetime(2023, 2, 13, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.003', 'CODFUNCAO': '000257', 'SALARIO': Decimal('1838.66'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 5, 'CHAPA': '030', 'NOME': 'JORGE LUIZ VEIGA DOS SANTOS', 'CPF': '82846901287', 'SECAO': 'CONTABILIDADE', 'FUNCAO': 'Supervisor de Contabilidade Nivel V', 'DATAADMISSAO': datetime.datetime(2025, 5, 25, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '1.12', 'CODFUNCAO': '000391', 'SALARIO': Decimal('4107.25'), 'CODSINDICATO': '01', 'INICIOPER': None, 'FIMPER': None, 'SALDO_MINUTOS': None}
{'CODCOLIGADA': 1, 'CHAPA': '052046', 'NOME': 'JOSAFA DE LIMA ANGELINO', 'CPF': '03269190239', 'SECAO': 'LOJA 4 OPERACIONAL', 'FUNCAO': 'ASSISTENTE DE CREDITO', 'DATAADMISSAO': datetime.datetime(2024, 7, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '004.001.002', 'CODFUNCAO': '000134', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 11475}
{'CODCOLIGADA': 1, 'CHAPA': '005724', 'NOME': 'JOSE ALZIE DE SOUZA LIMA', 'CPF': '98007890220', 'SECAO': 'LOJA 9 OPERACIONAL', 'FUNCAO': 'Repositor de mercadorias Nivel VI', 'DATAADMISSAO': datetime.datetime(2021, 12, 7, 0, 0), 'CODSITUACAO': 'F', 'CODSECAO': '009.001.002', 'CODFUNCAO': '000320', 'SALARIO': Decimal('2043.00'), 'CODSINDICATO': '03', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -1361}
{'CODCOLIGADA': 2, 'CHAPA': '044917', 'NOME': 'JOSE ANTONIO PINHEIRO MIRANDA', 'CPF': '87044412220', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Motorista Nivel II', 'DATAADMISSAO': datetime.datetime(2022, 1, 7, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000284', 'SALARIO': Decimal('2787.22'), 'CODSINDICATO': '02', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 3, 'CHAPA': '003819', 'NOME': 'JOSE ANTONIO SOUSA COSTA', 'CPF': '01863256229', 'SECAO': 'SEGURANCA PATRIMONIAL', 'FUNCAO': 'Supervisor de Seguranca Patrimonial', 'DATAADMISSAO': datetime.datetime(2022, 4, 21, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.003', 'CODFUNCAO': '000394', 'SALARIO': Decimal('2454.50'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 2, 'CHAPA': '051909', 'NOME': 'JOSE BENEDITO CORREA ALVES', 'CPF': '70268479291', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2024, 5, 6, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 2, 'CHAPA': '004417', 'NOME': 'JOSE CARLOS SOUSA', 'CPF': '80120296268', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2019, 1, 31, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 3, 'CHAPA': '000383', 'NOME': 'JOSE DA CONCEICAO BARBOSA', 'CPF': '17831750282', 'SECAO': 'EXPANSAO E MANUTENCAO', 'FUNCAO': 'Servente de Pedreiro', 'DATAADMISSAO': datetime.datetime(2018, 10, 1, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.001', 'CODFUNCAO': '000177', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '04', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -11512}
{'CODCOLIGADA': 1, 'CHAPA': '052607', 'NOME': 'JOSE FELIPE ASSUNCAO GOMES', 'CPF': '08424655290', 'SECAO': 'LOJA 9 OPERACIONAL', 'FUNCAO': 'Auxiliar de estoque Nivel V', 'DATAADMISSAO': datetime.datetime(2025, 11, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '009.001.002', 'CODFUNCAO': '000321', 'SALARIO': Decimal('1851.00'), 'CODSINDICATO': '03', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 1317}
{'CODCOLIGADA': 2, 'CHAPA': '052118', 'NOME': 'JOSE HELENO DA SILVA DE OLIVEIRA', 'CPF': '04992561233', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2024, 7, 26, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.003', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 2, 'CHAPA': '051891', 'NOME': 'JOSE LUCAS DE OLIVEIRA VIEIRA', 'CPF': '03699763200', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2024, 4, 15, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 3, 'CHAPA': '051825', 'NOME': 'JOSE LUICIO OLIVEIRA DA SILVA', 'CPF': '04827544271', 'SECAO': 'SEGURANCA PATRIMONIAL', 'FUNCAO': 'Fiscal de Loja', 'DATAADMISSAO': datetime.datetime(2024, 1, 8, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.003', 'CODFUNCAO': '000116', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -241}
{'CODCOLIGADA': 1, 'CHAPA': '005711', 'NOME': 'JOSE ONERYS MOTA RODRIGUES', 'CPF': '10089055268', 'SECAO': 'LOJA 9 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas Nivel VI', 'DATAADMISSAO': datetime.datetime(2021, 11, 24, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '009.001.002', 'CODFUNCAO': '000313', 'SALARIO': Decimal('2043.00'), 'CODSINDICATO': '03', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 17684}
{'CODCOLIGADA': 1, 'CHAPA': '051698', 'NOME': 'JOSE RICHARD DA SILVA OLIVEIRA', 'CPF': '99142899249', 'SECAO': 'LOJA 2 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2023, 8, 16, 0, 0), 'CODSITUACAO': 'F', 'CODSECAO': '002.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 6134}
{'CODCOLIGADA': 2, 'CHAPA': '052343', 'NOME': 'JOSE RICHELE DOS SANTOS DAMASCENO', 'CPF': '55616011215', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2024, 12, 16, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 2, 'CHAPA': '052128', 'NOME': 'JOSE ROBERTO DE OLIVEIRA PINHEIRO', 'CPF': '58144218272', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2024, 8, 6, 0, 0), 'CODSITUACAO': 'P', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 2, 'CHAPA': '044910', 'NOME': 'JOSE ROBERTO FERREIRA AFONSO', 'CPF': '73280690234', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Motorista Nivel I', 'DATAADMISSAO': datetime.datetime(2021, 12, 1, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000161', 'SALARIO': Decimal('2163.23'), 'CODSINDICATO': '02', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '003941', 'NOME': 'JOSE RODRIGUES SERRAO', 'CPF': '68979606249', 'SECAO': 'LOJA 5 OPERACIONAL', 'FUNCAO': 'Embalador', 'DATAADMISSAO': datetime.datetime(2021, 3, 1, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '005.001.002', 'CODFUNCAO': '000075', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 3134}
{'CODCOLIGADA': 1, 'CHAPA': '051464', 'NOME': 'JOSELMA DOS SANTOS ARAUJO', 'CPF': '84656689220', 'SECAO': 'LOJA 9 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas Nivel VI', 'DATAADMISSAO': datetime.datetime(2022, 7, 12, 0, 0), 'CODSITUACAO': 'F', 'CODSECAO': '009.001.002', 'CODFUNCAO': '000313', 'SALARIO': Decimal('2043.00'), 'CODSINDICATO': '03', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 11642}
{'CODCOLIGADA': 2, 'CHAPA': '052326', 'NOME': 'JOSEPH MATHEUS GOES AMOEDO', 'CPF': '70143221256', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2024, 12, 16, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '052606', 'NOME': 'JOSIANE RODRIGUES CARDOSO AVELAR', 'CPF': '66713366287', 'SECAO': 'LOJA 2 OPERACIONAL', 'FUNCAO': 'Servicos Gerais', 'DATAADMISSAO': datetime.datetime(2025, 11, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '002.001.002', 'CODFUNCAO': '000059', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -784}
{'CODCOLIGADA': 1, 'CHAPA': '052478', 'NOME': 'JOSIMAR LUIS DA SILVA E SILVA JUNIOR', 'CPF': '04056984298', 'SECAO': 'SEGURANCA PATRIMONIAL', 'FUNCAO': 'Fiscal de Loja', 'DATAADMISSAO': datetime.datetime(2025, 4, 10, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '010.001.004', 'CODFUNCAO': '000116', 'SALARIO': Decimal('1780.00'), 'CODSINDICATO': '05', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 4671}
{'CODCOLIGADA': 2, 'CHAPA': '052520', 'NOME': 'JOTAN LEAL DA CUNHA', 'CPF': '06911227259', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2025, 5, 23, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.003', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '003672', 'NOME': 'JOY TAVARES PAES', 'CPF': '96248734291', 'SECAO': 'LOJA 4 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2018, 9, 1, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '004.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 992}
{'CODCOLIGADA': 2, 'CHAPA': '044107', 'NOME': 'JUCELINO PEREIRA SOUZA', 'CPF': '68293607220', 'SECAO': 'LOGISTICA OPERACIONAL BR', 'FUNCAO': 'Encarregado de Logistica Nivel I', 'DATAADMISSAO': datetime.datetime(2020, 12, 14, 0, 0), 'CODSITUACAO': 'P', 'CODSECAO': '001.004.005', 'CODFUNCAO': '000259', 'SALARIO': Decimal('1930.60'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 6178}
{'CODCOLIGADA': 3, 'CHAPA': '052588', 'NOME': 'JULIANY SAFIRA SOUZA DE SOUZA', 'CPF': '08761899232', 'SECAO': 'GENTE E GESTAO', 'FUNCAO': 'Auxiliar Administrativo', 'DATAADMISSAO': datetime.datetime(2025, 9, 2, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.009', 'CODFUNCAO': '000021', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 245}
{'CODCOLIGADA': 2, 'CHAPA': '051984', 'NOME': 'JULIO ARTUR LIMA DOS ANJOS', 'CPF': '03614960285', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2024, 6, 17, 0, 0), 'CODSITUACAO': 'V', 'CODSECAO': '001.004.003', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '052080', 'NOME': 'KAMILLY EMANUELLY DOS SANTOS VELOSO', 'CPF': '03169884212', 'SECAO': 'LOJA 9 OPERACIONAL', 'FUNCAO': 'Operador de caixa Nivel VI', 'DATAADMISSAO': datetime.datetime(2024, 9, 9, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '009.001.002', 'CODFUNCAO': '000317', 'SALARIO': Decimal('2043.00'), 'CODSINDICATO': '03', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -3472}
{'CODCOLIGADA': 5, 'CHAPA': '032', 'NOME': 'KARLA GISELLI DOS SANTOS BATISTA', 'CPF': '73300390206', 'SECAO': 'AUDITORIA', 'FUNCAO': 'Gerente de Controladoria', 'DATAADMISSAO': datetime.datetime(2025, 8, 20, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '1.13', 'CODFUNCAO': '000423', 'SALARIO': Decimal('8100.00'), 'CODSINDICATO': '01', 'INICIOPER': None, 'FIMPER': None, 'SALDO_MINUTOS': None}
{'CODCOLIGADA': 1, 'CHAPA': '052219', 'NOME': 'KARLOS ICARO RODRIGUES FERRAZ', 'CPF': '08849831293', 'SECAO': 'LOJA 8 OPERACIONAL', 'FUNCAO': 'Auxiliar de Estoque Nivel I', 'DATAADMISSAO': datetime.datetime(2024, 10, 7, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '008.001.002', 'CODFUNCAO': '000280', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 399}
{'CODCOLIGADA': 1, 'CHAPA': '052485', 'NOME': 'KAROLINE NATERCIA SILVA DE OLIVEIRA', 'CPF': '03060424284', 'SECAO': 'LOJA 9 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas Nivel VI', 'DATAADMISSAO': datetime.datetime(2025, 5, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '009.001.002', 'CODFUNCAO': '000313', 'SALARIO': Decimal('2043.00'), 'CODSINDICATO': '03', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -2223}
{'CODCOLIGADA': 2, 'CHAPA': '052291', 'NOME': 'KAUA SENA SILVA', 'CPF': '05932872233', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2024, 11, 18, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.003', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '052529', 'NOME': 'KAUA ULYSSES SANTOS DA SILVA', 'CPF': '06945820262', 'SECAO': 'LOJA 2 OPERACIONAL', 'FUNCAO': 'Auxiliar de Reposição', 'DATAADMISSAO': datetime.datetime(2025, 6, 6, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '002.001.002', 'CODFUNCAO': '000327', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -376}
{'CODCOLIGADA': 1, 'CHAPA': '052451', 'NOME': 'KAUE LISBOA OLIVEIRA', 'CPF': '05245078210', 'SECAO': 'LOJA 1 OPERACIONAL', 'FUNCAO': 'Auxiliar de Reposição', 'DATAADMISSAO': datetime.datetime(2025, 3, 7, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.002', 'CODFUNCAO': '000327', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 1360}
{'CODCOLIGADA': 1, 'CHAPA': '051967', 'NOME': 'KAWA SOARES QUARESMA', 'CPF': '06023007201', 'SECAO': 'SEGURANCA PATRIMONIAL', 'FUNCAO': 'Fiscal de Loja', 'DATAADMISSAO': datetime.datetime(2024, 7, 1, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '010.001.004', 'CODFUNCAO': '000116', 'SALARIO': Decimal('1780.00'), 'CODSINDICATO': '05', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 7390}
{'CODCOLIGADA': 1, 'CHAPA': '051850', 'NOME': 'KEDMA SOANI FAVACHO SARAIVA', 'CPF': '97726052287', 'SECAO': 'LOJA 4 OPERACIONAL', 'FUNCAO': 'Operador de Caixa', 'DATAADMISSAO': datetime.datetime(2024, 2, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '004.001.002', 'CODFUNCAO': '000042', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 16564}
{'CODCOLIGADA': 1, 'CHAPA': '052379', 'NOME': 'KELLY ANNE BRAGA SIZO OLIVEIRA', 'CPF': '92837620297', 'SECAO': 'LOJA 3 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2025, 2, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '003.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -5813}
{'CODCOLIGADA': 1, 'CHAPA': '052599', 'NOME': 'KELVIN CAUA DE SOUSA CHAVES', 'CPF': '01981295216', 'SECAO': 'LOJA 9 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas Nivel VI', 'DATAADMISSAO': datetime.datetime(2025, 10, 15, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '009.001.002', 'CODFUNCAO': '000313', 'SALARIO': Decimal('2043.00'), 'CODSINDICATO': '03', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 214}
{'CODCOLIGADA': 1, 'CHAPA': '052598', 'NOME': 'KESSIA DO NASCIMENTO FERNANDES', 'CPF': '06525558298', 'SECAO': 'LOJA 9 OPERACIONAL', 'FUNCAO': 'Operador de caixa Nivel VI', 'DATAADMISSAO': datetime.datetime(2025, 10, 15, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '009.001.002', 'CODFUNCAO': '000317', 'SALARIO': Decimal('2043.00'), 'CODSINDICATO': '03', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 1707}
{'CODCOLIGADA': 1, 'CHAPA': '003452', 'NOME': 'KETH GEYSE BARBOSA DE JESUS', 'CPF': '92443060268', 'SECAO': 'LOJA 3 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2021, 8, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '003.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 33530}
{'CODCOLIGADA': 2, 'CHAPA': '052473', 'NOME': 'KLEBISON DA SILVEIRA BORGES', 'CPF': '06889518217', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2025, 4, 15, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.003', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 2, 'CHAPA': '052414', 'NOME': 'KLEIDSON LIMA DE BARROS', 'CPF': '93228740234', 'SECAO': 'LOGISTICA SUPPLY', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2025, 2, 17, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.006', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 2, 'CHAPA': '052416', 'NOME': 'KLEYTON ROBERTO DO CARMO ARAÚJO', 'CPF': '65124731249', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Motorista Nivel I', 'DATAADMISSAO': datetime.datetime(2025, 2, 3, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000161', 'SALARIO': Decimal('2163.23'), 'CODSINDICATO': '02', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 2, 'CHAPA': '052249', 'NOME': 'LADILSON COLARES SOLEDADE', 'CPF': '69528403204', 'SECAO': 'LOGISTICA ESTOQUE', 'FUNCAO': 'Assistente de Estoque IV', 'DATAADMISSAO': datetime.datetime(2024, 10, 11, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.003.013', 'CODFUNCAO': '000282', 'SALARIO': Decimal('1838.66'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 3, 'CHAPA': '051565', 'NOME': 'LAERCIO PINTO DA CUNHA', 'CPF': '61549924249', 'SECAO': 'SEGURANCA PATRIMONIAL', 'FUNCAO': 'Fiscal de Loja', 'DATAADMISSAO': datetime.datetime(2023, 2, 6, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.003', 'CODFUNCAO': '000116', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 2961}
{'CODCOLIGADA': 3, 'CHAPA': '051600', 'NOME': 'LAIS ELIOENA ALVES PEREIRA LEMOS', 'CPF': '02314435281', 'SECAO': 'CONTABILIDADE', 'FUNCAO': 'Gerente de Contabilidade Nivel I', 'DATAADMISSAO': datetime.datetime(2023, 3, 13, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.002', 'CODFUNCAO': '000268', 'SALARIO': Decimal('4061.48'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 5038}
{'CODCOLIGADA': 3, 'CHAPA': '051760', 'NOME': 'LARISSA FURTADO DOS SANTOS', 'CPF': '06461055231', 'SECAO': 'GENTE E GESTAO', 'FUNCAO': 'Coordenador(a) de Gente e Gestão', 'DATAADMISSAO': datetime.datetime(2023, 10, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.009', 'CODFUNCAO': '000422', 'SALARIO': Decimal('4067.48'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 4924}
{'CODCOLIGADA': 1, 'CHAPA': '051687', 'NOME': 'LARISSA PALOMA PENA DOS SANTOS', 'CPF': '01825768250', 'SECAO': 'LOJA 4 OPERACIONAL', 'FUNCAO': 'ASSISTENTE DE CREDITO', 'DATAADMISSAO': datetime.datetime(2023, 8, 7, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '004.001.002', 'CODFUNCAO': '000134', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -329}
{'CODCOLIGADA': 3, 'CHAPA': '052324', 'NOME': 'LAURA REIS DE CARVALHO', 'CPF': '06050470227', 'SECAO': 'MARKETING', 'FUNCAO': 'Analista de Marketing Nivel V ', 'DATAADMISSAO': datetime.datetime(2024, 12, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.004', 'CODFUNCAO': '000417', 'SALARIO': Decimal('2650.87'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 779}
{'CODCOLIGADA': 2, 'CHAPA': '051534', 'NOME': 'LAURO ANTONIO DOS SANTOS BARREIROS', 'CPF': '85460176204', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2022, 12, 6, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '036143', 'NOME': 'LEANDRO DA SILVA BARREIROS', 'CPF': '70453648223', 'SECAO': 'LOJA 4 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2020, 12, 9, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '004.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 11694}
{'CODCOLIGADA': 2, 'CHAPA': '052204', 'NOME': 'LEANDRO HENRIQUE SANTOS COSTA', 'CPF': '55434681215', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2024, 10, 7, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '051498', 'NOME': 'LEIDIANE DO CARMO ARAUJO', 'CPF': '80831095253', 'SECAO': 'LOJA 1 OPERACIONAL', 'FUNCAO': 'ASSISTENTE DE CREDITO', 'DATAADMISSAO': datetime.datetime(2022, 10, 10, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.002', 'CODFUNCAO': '000134', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 6818}
{'CODCOLIGADA': 1, 'CHAPA': '052069', 'NOME': 'LEILA CRISTINA DO NASCIMENTO BRITO', 'CPF': '99995000210', 'SECAO': 'LOJA 9 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas Nivel VI', 'DATAADMISSAO': datetime.datetime(2024, 9, 9, 0, 0), 'CODSITUACAO': 'F', 'CODSECAO': '009.001.002', 'CODFUNCAO': '000313', 'SALARIO': Decimal('2043.00'), 'CODSINDICATO': '03', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -5844}
{'CODCOLIGADA': 1, 'CHAPA': '051488', 'NOME': 'LEILA PEDREIRA DO CARMO', 'CPF': '42302048253', 'SECAO': 'LOJA 1 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2022, 9, 14, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 1340}
{'CODCOLIGADA': 1, 'CHAPA': '051697', 'NOME': 'LENILDO DA CONCEICAO SOUZA', 'CPF': '00932366201', 'SECAO': 'LOJA 9 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas Nivel VI', 'DATAADMISSAO': datetime.datetime(2023, 8, 16, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '009.001.002', 'CODFUNCAO': '000313', 'SALARIO': Decimal('2043.00'), 'CODSINDICATO': '03', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 3055}
{'CODCOLIGADA': 1, 'CHAPA': '003359', 'NOME': 'LENISE DE SOUZA ANDRADE COSTA', 'CPF': '95816259253', 'SECAO': 'LOJA 3 OPERACIONAL', 'FUNCAO': 'Gerente de Loja', 'DATAADMISSAO': datetime.datetime(2021, 4, 6, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '003.001.002', 'CODFUNCAO': '000208', 'SALARIO': Decimal('3729.18'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 2, 'CHAPA': '044866', 'NOME': 'LEONARDO CORREA RODRIGUES', 'CPF': '98125320210', 'SECAO': 'LOGISTICA ESTOQUE', 'FUNCAO': 'Analista de logistica Nivel III', 'DATAADMISSAO': datetime.datetime(2021, 8, 10, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.003.013', 'CODFUNCAO': '000254', 'SALARIO': Decimal('2251.85'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '051514', 'NOME': 'LEONARDO DOS SANTOS GALVAO', 'CPF': '03260169296', 'SECAO': 'LOJA 3 OPERACIONAL', 'FUNCAO': 'Auxiliar de Estoque Nivel I', 'DATAADMISSAO': datetime.datetime(2022, 11, 11, 0, 0), 'CODSITUACAO': 'F', 'CODSECAO': '003.001.002', 'CODFUNCAO': '000280', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 3637}
{'CODCOLIGADA': 1, 'CHAPA': '052566', 'NOME': 'LEONARDO PINTO DA SILVA FILHO', 'CPF': '03437235222', 'SECAO': 'LOJA 5 OPERACIONAL', 'FUNCAO': 'Auxiliar de Estoque Nivel I', 'DATAADMISSAO': datetime.datetime(2025, 8, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '005.001.002', 'CODFUNCAO': '000280', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 1863}
{'CODCOLIGADA': 2, 'CHAPA': '051774', 'NOME': 'LEONARDO SILVA DA SILVA', 'CPF': '01358386226', 'SECAO': 'LOGISTICA OPERACIONAL BR', 'FUNCAO': 'Assistente de Logistica Nivel IV', 'DATAADMISSAO': datetime.datetime(2023, 10, 24, 0, 0), 'CODSITUACAO': 'F', 'CODSECAO': '001.004.005', 'CODFUNCAO': '000257', 'SALARIO': Decimal('1838.66'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -440}
{'CODCOLIGADA': 1, 'CHAPA': '051650', 'NOME': 'LEONARDO VINICIUS ALVES NUNES', 'CPF': '02620363209', 'SECAO': 'LOGISTICA OPERACIONAL BR', 'FUNCAO': 'Encarregado de Logistica Nivel IV', 'DATAADMISSAO': datetime.datetime(2023, 5, 18, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '006.004.002', 'CODFUNCAO': '000422', 'SALARIO': Decimal('2454.50'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '052354', 'NOME': 'LETICIA ADRIANA GOMES RENTE', 'CPF': '07778892340', 'SECAO': 'LOJA 8 OPERACIONAL', 'FUNCAO': 'APRENDIZ', 'DATAADMISSAO': datetime.datetime(2025, 1, 6, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '008.001.002', 'CODFUNCAO': '000038', 'SALARIO': Decimal('761.55'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -392}
{'CODCOLIGADA': 1, 'CHAPA': '003375', 'NOME': 'LILIANE PEREIRA DA SILVA', 'CPF': '72275723234', 'SECAO': 'LOJA 4 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2022, 6, 1, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '004.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 8779}
{'CODCOLIGADA': 2, 'CHAPA': '044175', 'NOME': 'LORENA CRISTINA DOS REIS DE BRITO', 'CPF': '96791780215', 'SECAO': 'COMPRAS', 'FUNCAO': 'Analista de Compras IV', 'DATAADMISSAO': datetime.datetime(2021, 6, 25, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.003.006', 'CODFUNCAO': '000421', 'SALARIO': Decimal('2454.50'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 760}
{'CODCOLIGADA': 1, 'CHAPA': '051121', 'NOME': 'LORRAN DE JESUS DOS SANTOS', 'CPF': '92988962200', 'SECAO': 'LOGISTICA ESTOQUE', 'FUNCAO': 'Assistente de Logistica Nivel IV', 'DATAADMISSAO': datetime.datetime(2021, 7, 12, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '006.003.013', 'CODFUNCAO': '000257', 'SALARIO': Decimal('1838.66'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 9289}
{'CODCOLIGADA': 1, 'CHAPA': '052045', 'NOME': 'LORRANY PINTO BARBOSA', 'CPF': '03774316210', 'SECAO': 'LOJA 4 OPERACIONAL', 'FUNCAO': 'ASSISTENTE DE CREDITO', 'DATAADMISSAO': datetime.datetime(2024, 7, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '004.001.002', 'CODFUNCAO': '000134', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 18851}
{'CODCOLIGADA': 3, 'CHAPA': '051780', 'NOME': 'LOURIMAR JOSE MONTEIRO FIGUEIREDO', 'CPF': '18969534253', 'SECAO': 'SEGURANCA PATRIMONIAL', 'FUNCAO': 'Fiscal de Loja', 'DATAADMISSAO': datetime.datetime(2023, 11, 6, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.003', 'CODFUNCAO': '000116', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 3596}
{'CODCOLIGADA': 1, 'CHAPA': '003657', 'NOME': 'LOURIVAL EDVALDO COSTA FERREIRA', 'CPF': '44054513204', 'SECAO': 'LOJA 4 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2017, 11, 14, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '004.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 5288}
{'CODCOLIGADA': 5, 'CHAPA': '034', 'NOME': 'LUAN DA ROCHA PEREIRA', 'CPF': '02137922223', 'SECAO': 'AUTONOMOS', 'FUNCAO': 'Gerente de Logistica', 'DATAADMISSAO': datetime.datetime(2026, 1, 23, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '1.01', 'CODFUNCAO': '000047', 'SALARIO': Decimal('8500.00'), 'CODSINDICATO': '01', 'INICIOPER': None, 'FIMPER': None, 'SALDO_MINUTOS': None}
{'CODCOLIGADA': 2, 'CHAPA': '052526', 'NOME': 'LUAN EVILAZIO LIMA RODRIGUES', 'CPF': '05882034248', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2025, 5, 24, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.003', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 2, 'CHAPA': '051703', 'NOME': 'LUAN NEGRAO DA COSTA', 'CPF': '05054828273', 'SECAO': 'LOGISTICA OPERACIONAL BR', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2023, 8, 16, 0, 0), 'CODSITUACAO': 'I', 'CODSECAO': '001.004.005', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '052085', 'NOME': 'LUCAS ARAUJO DE SOUZA', 'CPF': '00064346226', 'SECAO': 'LOJA 9 OPERACIONAL', 'FUNCAO': 'Repositor de Mercadoria', 'DATAADMISSAO': datetime.datetime(2024, 9, 9, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '009.001.002', 'CODFUNCAO': '000043', 'SALARIO': Decimal('2043.00'), 'CODSINDICATO': '03', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -10385}
{'CODCOLIGADA': 1, 'CHAPA': '036142', 'NOME': 'LUCAS ARTHUR ANDRADE CORREA', 'CPF': '02730978224', 'SECAO': 'LOGISTICA ESTOQUE', 'FUNCAO': 'Analista de logistica Nivel III', 'DATAADMISSAO': datetime.datetime(2020, 11, 11, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '006.003.013', 'CODFUNCAO': '000254', 'SALARIO': Decimal('2251.85'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '051494', 'NOME': 'LUCAS CAUA RAIOL DOS SANTOS', 'CPF': '05978925208', 'SECAO': 'LOJA 4 OPERACIONAL', 'FUNCAO': 'Auxiliar de Reposição', 'DATAADMISSAO': datetime.datetime(2022, 9, 21, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '004.001.002', 'CODFUNCAO': '000327', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 18072}
{'CODCOLIGADA': 2, 'CHAPA': '052393', 'NOME': 'LUCAS CLAYTON BARBOSA DE SOUSA', 'CPF': '02902864256', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2025, 2, 3, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.003', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 2, 'CHAPA': '052161', 'NOME': 'LUCAS COELHO SOUSA', 'CPF': '03931172279', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Assistente de Logistica Nivel I', 'DATAADMISSAO': datetime.datetime(2024, 9, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.003', 'CODFUNCAO': '000238', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 2, 'CHAPA': '051980', 'NOME': 'LUCAS MEDA FONTES DOS SANTOS', 'CPF': '06130866275', 'SECAO': 'LOJA 4 OPERACIONAL', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2024, 6, 17, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.004', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 2, 'CHAPA': '052435', 'NOME': 'LUCAS PABLO DUARTE DA SILVA', 'CPF': '02250344256', 'SECAO': 'LOGISTICA OPERACIONAL BR', 'FUNCAO': 'Assistente de Logistica Nivel IV', 'DATAADMISSAO': datetime.datetime(2025, 2, 17, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.005', 'CODFUNCAO': '000257', 'SALARIO': Decimal('1838.66'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '051708', 'NOME': 'LUCAS SOUZA DE JESUS', 'CPF': '04151695265', 'SECAO': 'LOJA 9 OPERACIONAL', 'FUNCAO': 'Repositor de mercadorias Nivel VI', 'DATAADMISSAO': datetime.datetime(2023, 9, 4, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '009.001.002', 'CODFUNCAO': '000320', 'SALARIO': Decimal('2043.00'), 'CODSINDICATO': '03', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -880}
{'CODCOLIGADA': 1, 'CHAPA': '052380', 'NOME': 'LUCIANA ALVES GOMES', 'CPF': '61513113291', 'SECAO': 'LOJA 3 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2025, 2, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '003.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 2084}
{'CODCOLIGADA': 1, 'CHAPA': '051471', 'NOME': 'LUCIANA CAROLINA ALVAREZ DE OLIVEIRA', 'CPF': '88769593272', 'SECAO': 'LOJA 2 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2022, 8, 1, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '002.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 16179}
{'CODCOLIGADA': 5, 'CHAPA': '021', 'NOME': 'LUCIANA LOBATO SILVA', 'CPF': '00021864209', 'SECAO': 'GENTE E GESTAO', 'FUNCAO': 'Engenheiro(a) de Seg do Trabalho', 'DATAADMISSAO': datetime.datetime(2024, 12, 1, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '1.07', 'CODFUNCAO': '000402', 'SALARIO': Decimal('1500.00'), 'CODSINDICATO': '01', 'INICIOPER': None, 'FIMPER': None, 'SALDO_MINUTOS': None}
{'CODCOLIGADA': 2, 'CHAPA': '051618', 'NOME': 'LUCINALDO PESSOA GOMES', 'CPF': '45408386287', 'SECAO': 'LOGISTICA ESTOQUE', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2023, 4, 17, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.003.013', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 2, 'CHAPA': '052157', 'NOME': 'LUCIVALDO MONTEIRO PINTO', 'CPF': '00013852248', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2024, 9, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 2, 'CHAPA': '044119', 'NOME': 'LUIS AUGUSTO DE SOUZA FURTADO', 'CPF': '87172305272', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Encarregado de Logistica Nivel I', 'DATAADMISSAO': datetime.datetime(2021, 1, 7, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.003', 'CODFUNCAO': '000259', 'SALARIO': Decimal('1930.60'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '052609', 'NOME': 'LUIS FELIPE MONTEIRO DUTRA', 'CPF': '08790237242', 'SECAO': 'LOJA 4 OPERACIONAL', 'FUNCAO': 'Auxiliar de Reposição', 'DATAADMISSAO': datetime.datetime(2025, 11, 14, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '004.001.002', 'CODFUNCAO': '000327', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 1693}
{'CODCOLIGADA': 1, 'CHAPA': '052631', 'NOME': 'LUIS MULLER NOGUEIRA DA SILVA', 'CPF': '06229396297', 'SECAO': 'LOJA 4 OPERACIONAL', 'FUNCAO': 'Auxiliar de Reposição', 'DATAADMISSAO': datetime.datetime(2026, 1, 13, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '004.001.002', 'CODFUNCAO': '000327', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 25}
{'CODCOLIGADA': 1, 'CHAPA': '003930', 'NOME': 'LUIZ ANTONIO FREITAS CRUZ', 'CPF': '51196425272', 'SECAO': 'SEGURANCA PATRIMONIAL', 'FUNCAO': 'Fiscal de Loja', 'DATAADMISSAO': datetime.datetime(2020, 7, 25, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '006.003.010', 'CODFUNCAO': '000116', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -1003}
{'CODCOLIGADA': 3, 'CHAPA': '052480', 'NOME': 'LUIZ CARLOS FERREIRA', 'CPF': '01360739211', 'SECAO': 'SEGURANCA PATRIMONIAL', 'FUNCAO': 'Fiscal de Loja', 'DATAADMISSAO': datetime.datetime(2025, 4, 17, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.003', 'CODFUNCAO': '000116', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 2264}
{'CODCOLIGADA': 1, 'CHAPA': '036106', 'NOME': 'LUIZ CESAR MARTINS FIGUEIREDO', 'CPF': '08125406204', 'SECAO': 'LOJA 4 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2019, 12, 2, 0, 0), 'CODSITUACAO': 'F', 'CODSECAO': '004.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -224}
{'CODCOLIGADA': 2, 'CHAPA': '044973', 'NOME': 'LUIZ CEZAR DA SILVA MACEDO', 'CPF': '01892694212', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Motorista Nivel II', 'DATAADMISSAO': datetime.datetime(2022, 4, 1, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000284', 'SALARIO': Decimal('2787.22'), 'CODSINDICATO': '02', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 2, 'CHAPA': '051614', 'NOME': 'LUIZ FABIO FERREIRA DA SILVA', 'CPF': '47998865253', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Motorista Nivel I', 'DATAADMISSAO': datetime.datetime(2023, 4, 3, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000161', 'SALARIO': Decimal('2163.23'), 'CODSINDICATO': '02', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '051898', 'NOME': 'LUIZ HENRIQUE DE SOUZA PINTO', 'CPF': '65806620263', 'SECAO': 'LOJA 9 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas Nivel VI', 'DATAADMISSAO': datetime.datetime(2024, 4, 15, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '009.001.002', 'CODFUNCAO': '000313', 'SALARIO': Decimal('2043.00'), 'CODSINDICATO': '03', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 1508}
{'CODCOLIGADA': 2, 'CHAPA': '052001', 'NOME': 'LUIZ HENRIQUE MELO BORGES', 'CPF': '04588621262', 'SECAO': 'COMPRAS', 'FUNCAO': 'Assistente de Compras', 'DATAADMISSAO': datetime.datetime(2024, 6, 21, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.003.006', 'CODFUNCAO': '000222', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -1896}
{'CODCOLIGADA': 2, 'CHAPA': '052591', 'NOME': 'LUIZ HENRIQUE SANTOS FERREIRA', 'CPF': '02823424270', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Servicos Gerais', 'DATAADMISSAO': datetime.datetime(2025, 10, 6, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000165', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 3, 'CHAPA': '052579', 'NOME': 'LUIZ RAMON LOPES VIEIRA', 'CPF': '03775603247', 'SECAO': 'SEGURANCA PATRIMONIAL', 'FUNCAO': 'Fiscal de Loja', 'DATAADMISSAO': datetime.datetime(2025, 9, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.003', 'CODFUNCAO': '000116', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 5823}
{'CODCOLIGADA': 1, 'CHAPA': '052167', 'NOME': 'LUIZ SERGIO MACIEL SANTANA', 'CPF': '39449580200', 'SECAO': 'LOJA 4 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2024, 9, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '004.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 3269}
{'CODCOLIGADA': 2, 'CHAPA': '052546', 'NOME': 'LUIZA D VIVIANE COSTA DOS SANTOS', 'CPF': '70435889281', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Assistente de Logistica Nivel I', 'DATAADMISSAO': datetime.datetime(2025, 7, 7, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000238', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '005736', 'NOME': 'MACIVALDO EDMILSON DE BRITO JUNIOR', 'CPF': '03612018264', 'SECAO': 'LOJA 9 OPERACIONAL', 'FUNCAO': 'Supervisor de Estoque Nivel I', 'DATAADMISSAO': datetime.datetime(2022, 5, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '009.001.002', 'CODFUNCAO': '000256', 'SALARIO': Decimal('2454.50'), 'CODSINDICATO': '03', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 38551}
{'CODCOLIGADA': 2, 'CHAPA': '052227', 'NOME': 'MAGNAELSON ASSUNCAO MELO', 'CPF': '04773030216', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2024, 10, 11, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.003', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 2, 'CHAPA': '044896', 'NOME': 'MAICO DOUGLAS REBELO BRAZIL', 'CPF': '01672876214', 'SECAO': 'LOGISTICA SUPPLY', 'FUNCAO': 'Supervisor Administrativo nível IV', 'DATAADMISSAO': datetime.datetime(2021, 10, 11, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.006', 'CODFUNCAO': '000413', 'SALARIO': Decimal('3296.65'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 3, 'CHAPA': '051995', 'NOME': 'MAISA CRISTINA LEMOS DOS SANTOS', 'CPF': '70196918200', 'SECAO': 'SEGURANCA PATRIMONIAL', 'FUNCAO': 'Monitor de sistemas de segurança interno', 'DATAADMISSAO': datetime.datetime(2024, 6, 21, 0, 0), 'CODSITUACAO': 'F', 'CODSECAO': '001.001.003', 'CODFUNCAO': '000073', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 2843}
{'CODCOLIGADA': 2, 'CHAPA': '052095', 'NOME': 'MANOEL ABEL MONTEIRO DE SOUSA', 'CPF': '04046776226', 'SECAO': 'FINANCEIRO', 'FUNCAO': 'Analista Financeiro Nivel I', 'DATAADMISSAO': datetime.datetime(2024, 7, 26, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.003.001', 'CODFUNCAO': '000367', 'SALARIO': Decimal('1930.60'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -983}
{'CODCOLIGADA': 2, 'CHAPA': '044853', 'NOME': 'MANOEL FERNANDO PADILHA DA SILVA', 'CPF': '97076627272', 'SECAO': 'LOGISTICA ESTOQUE', 'FUNCAO': 'Supervisor de Logística Nível V', 'DATAADMISSAO': datetime.datetime(2021, 7, 9, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.002', 'CODFUNCAO': '000401', 'SALARIO': Decimal('3692.25'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '051449', 'NOME': 'MANOEL FIGUEIREDO VASCONCELOS', 'CPF': '58674489249', 'SECAO': 'LOJA 2 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2022, 6, 2, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '002.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 6763}
{'CODCOLIGADA': 2, 'CHAPA': '052210', 'NOME': 'MANOEL MIRANDA DE CASTRO', 'CPF': '39517306253', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2024, 10, 7, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '052634', 'NOME': 'MANOEL TRINDADE DE OLIVEIRA PINHEIRO', 'CPF': '40188264272', 'SECAO': 'LOJA 4 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2026, 2, 5, 0, 0), 'CODSITUACAO': 'Z', 'CODSECAO': '004.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': None, 'FIMPER': None, 'SALDO_MINUTOS': None}
{'CODCOLIGADA': 5, 'CHAPA': '033', 'NOME': 'MANOEL TRINDADE DE OLIVEIRA PINHEIRO', 'CPF': '40188264272', 'SECAO': 'LOJA 4 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2025, 9, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '1.14', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1518.00'), 'CODSINDICATO': '01', 'INICIOPER': None, 'FIMPER': None, 'SALDO_MINUTOS': None}
{'CODCOLIGADA': 2, 'CHAPA': '052025', 'NOME': 'MARCELO ALVES DA SILVA', 'CPF': '90835689204', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2024, 6, 22, 0, 0), 'CODSITUACAO': 'P', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '052614', 'NOME': 'MARCELO BORGES FONTEL', 'CPF': '58786236253', 'SECAO': 'LOJA 2 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2025, 11, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '002.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 596}
{'CODCOLIGADA': 2, 'CHAPA': '052245', 'NOME': 'MARCELO COSTA DA SILVA', 'CPF': '45563560244', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Operador de Empilhadeira Nivel I', 'DATAADMISSAO': datetime.datetime(2024, 10, 11, 0, 0), 'CODSITUACAO': 'F', 'CODSECAO': '001.004.003', 'CODFUNCAO': '000377', 'SALARIO': Decimal('2085.05'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 3, 'CHAPA': '003813', 'NOME': 'MARCELO DA CONCEICAO DA SILVA', 'CPF': '65923324253', 'SECAO': 'SEGURANCA PATRIMONIAL', 'FUNCAO': 'Fiscal de Loja', 'DATAADMISSAO': datetime.datetime(2022, 4, 2, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.003', 'CODFUNCAO': '000116', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 5046}
{'CODCOLIGADA': 1, 'CHAPA': '036167', 'NOME': 'MARCELO DA SILVA GOMES', 'CPF': '93410212272', 'SECAO': 'LOJA 2 OPERACIONAL', 'FUNCAO': 'Supervisor de Loja', 'DATAADMISSAO': datetime.datetime(2022, 5, 3, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '002.001.002', 'CODFUNCAO': '000240', 'SALARIO': Decimal('2724.51'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 10159}
{'CODCOLIGADA': 1, 'CHAPA': '052576', 'NOME': 'MARCIA FERREIRA ANDRE RODRIGUES', 'CPF': '00649324277', 'SECAO': 'LOJA 10 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2025, 10, 15, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '010.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '05', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 2257}
{'CODCOLIGADA': 1, 'CHAPA': '051923', 'NOME': 'MARCILEIA CARDOSO DOS SANTOS', 'CPF': '02664388223', 'SECAO': 'LOJA 1 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2024, 5, 15, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 4293}
{'CODCOLIGADA': 1, 'CHAPA': '051817', 'NOME': 'MARCILIO MONTEIRO PINTO', 'CPF': '65809106234', 'SECAO': 'COMERCIAL', 'FUNCAO': 'Supervisor de Loja', 'DATAADMISSAO': datetime.datetime(2024, 1, 1, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '006.003.014', 'CODFUNCAO': '000240', 'SALARIO': Decimal('2724.51'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -11251}
{'CODCOLIGADA': 2, 'CHAPA': '052359', 'NOME': 'MARCIO ANDRE DOS SANTOS TEIXEIRA', 'CPF': '01130990290', 'SECAO': 'COMPRAS', 'FUNCAO': 'Analista de Compras IV', 'DATAADMISSAO': datetime.datetime(2025, 1, 15, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.003.006', 'CODFUNCAO': '000421', 'SALARIO': Decimal('2454.50'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -2817}
{'CODCOLIGADA': 2, 'CHAPA': '004475', 'NOME': 'MARCIO DA SILVA TAVARES', 'CPF': '73514128200', 'SECAO': 'LOGISTICA OPERACIONAL BR', 'FUNCAO': 'Assistente de Logistica Nivel IV', 'DATAADMISSAO': datetime.datetime(2020, 7, 1, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.005', 'CODFUNCAO': '000257', 'SALARIO': Decimal('1838.66'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -264}
{'CODCOLIGADA': 5, 'CHAPA': '029', 'NOME': 'MARCIO DAYVID FERNANDES DA COSTA', 'CPF': '87740567272', 'SECAO': 'COMERCIAL', 'FUNCAO': 'Supervisor Geral', 'DATAADMISSAO': datetime.datetime(2025, 5, 25, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '1.06', 'CODFUNCAO': '000394', 'SALARIO': Decimal('8500.00'), 'CODSINDICATO': '01', 'INICIOPER': None, 'FIMPER': None, 'SALDO_MINUTOS': None}
{'CODCOLIGADA': 2, 'CHAPA': '052402', 'NOME': 'MARCIO DUARTE ANDRADE', 'CPF': '74925946234', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2025, 2, 3, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '052559', 'NOME': 'MARCIO FERNANDES PANTOJA PEREIRA', 'CPF': '01379444209', 'SECAO': 'LOJA 3 OPERACIONAL', 'FUNCAO': 'Auxiliar de Estoque Nivel I', 'DATAADMISSAO': datetime.datetime(2025, 8, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '003.001.002', 'CODFUNCAO': '000280', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 2317}
{'CODCOLIGADA': 3, 'CHAPA': '052580', 'NOME': 'MARCIO JADERSON SILVA DA COSTA', 'CPF': '58761900206', 'SECAO': 'SEGURANCA PATRIMONIAL', 'FUNCAO': 'Fiscal de Loja', 'DATAADMISSAO': datetime.datetime(2025, 9, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.003', 'CODFUNCAO': '000116', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 2768}
{'CODCOLIGADA': 3, 'CHAPA': '051876', 'NOME': 'MARCIO PENA MIRANDA', 'CPF': '48888966234', 'SECAO': 'SEGURANCA PATRIMONIAL', 'FUNCAO': 'Fiscal de Loja', 'DATAADMISSAO': datetime.datetime(2024, 4, 15, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.003', 'CODFUNCAO': '000116', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 1604}
{'CODCOLIGADA': 2, 'CHAPA': '052211', 'NOME': 'MARCIO ROBERTO ALVES PEREIRA', 'CPF': '75713713253', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2024, 10, 7, 0, 0), 'CODSITUACAO': 'F', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '003942', 'NOME': 'MARCIO SOUSA DA COSTA', 'CPF': '01668377250', 'SECAO': 'LOJA 5 OPERACIONAL', 'FUNCAO': 'Auxiliar de Reposição', 'DATAADMISSAO': datetime.datetime(2021, 4, 15, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '005.001.002', 'CODFUNCAO': '000327', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 5223}
{'CODCOLIGADA': 2, 'CHAPA': '052295', 'NOME': 'MARCOS ALEXANDRE MELO CONCEICAO', 'CPF': '07492793200', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2024, 11, 18, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.003', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '052254', 'NOME': 'MARCOS ANTONIO ALVES DA SILVA', 'CPF': '63655764200', 'SECAO': 'LOJA 3 OPERACIONAL', 'FUNCAO': 'Auxiliar de Reposição', 'DATAADMISSAO': datetime.datetime(2024, 10, 21, 0, 0), 'CODSITUACAO': 'F', 'CODSECAO': '003.001.002', 'CODFUNCAO': '000327', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 1849}
{'CODCOLIGADA': 2, 'CHAPA': '052213', 'NOME': 'MARCOS ANTONIO DE SOUZA MAIA', 'CPF': '02465084267', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Motorista Nivel I', 'DATAADMISSAO': datetime.datetime(2024, 10, 7, 0, 0), 'CODSITUACAO': 'F', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000161', 'SALARIO': Decimal('2163.23'), 'CODSINDICATO': '02', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '003453', 'NOME': 'MARCOS CABRAL DE SOUZA', 'CPF': '59190868234', 'SECAO': 'LOJA 5 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2021, 8, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '005.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 2238}
{'CODCOLIGADA': 2, 'CHAPA': '052510', 'NOME': 'MARCOS COSTA RODRIGUES', 'CPF': '00573446202', 'SECAO': 'LOGISTICA SUPPLY', 'FUNCAO': 'Encarregado de Logistica Nivel I', 'DATAADMISSAO': datetime.datetime(2025, 5, 15, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.006', 'CODFUNCAO': '000259', 'SALARIO': Decimal('1930.60'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 2, 'CHAPA': '044931', 'NOME': 'MARCOS FONSECA CORREA', 'CPF': '85991457204', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Motorista Nivel I', 'DATAADMISSAO': datetime.datetime(2022, 2, 1, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000161', 'SALARIO': Decimal('2163.23'), 'CODSINDICATO': '02', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 3, 'CHAPA': '052505', 'NOME': 'MARCOS GABRIEL DE ASSIS MATOS', 'CPF': '05861651264', 'SECAO': 'SEGURANCA PATRIMONIAL', 'FUNCAO': 'Fiscal de Loja', 'DATAADMISSAO': datetime.datetime(2025, 5, 15, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.003', 'CODFUNCAO': '000116', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 389}
{'CODCOLIGADA': 2, 'CHAPA': '004418', 'NOME': 'MARCOS PEREIRA FERREIRA', 'CPF': '02471199208', 'SECAO': 'LOJA 10 LOGISTICA', 'FUNCAO': 'Assistente de Logistica Nivel IV', 'DATAADMISSAO': datetime.datetime(2019, 2, 2, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.012', 'CODFUNCAO': '000257', 'SALARIO': Decimal('1838.66'), 'CODSINDICATO': '05', 'INICIOPER': None, 'FIMPER': None, 'SALDO_MINUTOS': None}
{'CODCOLIGADA': 2, 'CHAPA': '052140', 'NOME': 'MARCOS RAIMUNDO FREITAS PEREIRA', 'CPF': '60015942287', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2024, 8, 16, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.003', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '051448', 'NOME': 'MARCOS RICARDO MOURA TAVARES', 'CPF': '90149742215', 'SECAO': 'LOJA 8 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2022, 6, 1, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '008.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 3305}
{'CODCOLIGADA': 2, 'CHAPA': '052327', 'NOME': 'MARCOS SANTOS SILVA', 'CPF': '62153730287', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2024, 12, 16, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 2, 'CHAPA': '052518', 'NOME': 'MARCOS VINICIUS DE OLIVEIRA TRINDADE', 'CPF': '04390527266', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2025, 5, 23, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.003', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '003467', 'NOME': 'MARCUS VINICIUS SOUZA DA ROSA', 'CPF': '37311271215', 'SECAO': 'LOJA 4 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2022, 5, 3, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '004.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 2971}
{'CODCOLIGADA': 1, 'CHAPA': '051542', 'NOME': 'MARDIENE CASTRO RIBEIRO', 'CPF': '67053254291', 'SECAO': 'LOJA 3 OPERACIONAL', 'FUNCAO': 'Operador de Caixa', 'DATAADMISSAO': datetime.datetime(2023, 1, 2, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '003.001.002', 'CODFUNCAO': '000042', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 5737}
{'CODCOLIGADA': 1, 'CHAPA': '051941', 'NOME': 'MARIA DE JESUSDE NAZARE TELES FERREIRA', 'CPF': '78624509220', 'SECAO': 'LOJA 10 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2024, 7, 1, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '010.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '05', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 12828}
{'CODCOLIGADA': 1, 'CHAPA': '052350', 'NOME': 'MARIA EDUARDA ASSIS MAUES', 'CPF': '02126191281', 'SECAO': 'LOJA 5 OPERACIONAL', 'FUNCAO': 'APRENDIZ', 'DATAADMISSAO': datetime.datetime(2025, 1, 6, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '005.001.002', 'CODFUNCAO': '000038', 'SALARIO': Decimal('761.55'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -535}
{'CODCOLIGADA': 1, 'CHAPA': '052542', 'NOME': 'MARIA JOSIANE BALIEIRO DOS SANTOS', 'CPF': '91932602291', 'SECAO': 'LOJA 10 OPERACIONAL', 'FUNCAO': 'Operador de Caixa', 'DATAADMISSAO': datetime.datetime(2025, 6, 20, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '010.001.002', 'CODFUNCAO': '000042', 'SALARIO': Decimal('1780.00'), 'CODSINDICATO': '05', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 11016}
{'CODCOLIGADA': 1, 'CHAPA': '051463', 'NOME': 'MARIA LEANE ASSUNÇAO GOMES', 'CPF': '70444604294', 'SECAO': 'LOJA 9 OPERACIONAL', 'FUNCAO': 'Operador de caixa Nivel VI', 'DATAADMISSAO': datetime.datetime(2022, 7, 12, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '009.001.002', 'CODFUNCAO': '000317', 'SALARIO': Decimal('2043.00'), 'CODSINDICATO': '03', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 1848}
{'CODCOLIGADA': 1, 'CHAPA': '051942', 'NOME': 'MARIA SANTANA BITENCOURT BRITO', 'CPF': '83146490234', 'SECAO': 'LOJA 10 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2024, 7, 1, 0, 0), 'CODSITUACAO': 'F', 'CODSECAO': '010.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '05', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 14751}
{'CODCOLIGADA': 3, 'CHAPA': '051809', 'NOME': 'MARIELSON CORREA AMORAS', 'CPF': '05082489224', 'SECAO': 'SEGURANCA PATRIMONIAL', 'FUNCAO': 'Fiscal de loja Nivel VI', 'DATAADMISSAO': datetime.datetime(2023, 12, 15, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.003', 'CODFUNCAO': '000318', 'SALARIO': Decimal('2043.00'), 'CODSINDICATO': '03', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 1439}
{'CODCOLIGADA': 1, 'CHAPA': '052259', 'NOME': 'MARILENE BARBOSA DA SILVA', 'CPF': '01154219208', 'SECAO': 'LOJA 10 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2024, 11, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '010.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '05', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 6301}
{'CODCOLIGADA': 1, 'CHAPA': '052430', 'NOME': 'MARILIA ROCHA BATISTA', 'CPF': '37633708204', 'SECAO': 'LOJA 7 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas Nivel IV', 'DATAADMISSAO': datetime.datetime(2025, 2, 17, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '007.001.002', 'CODFUNCAO': '000294', 'SALARIO': Decimal('1838.66'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -522}
{'CODCOLIGADA': 3, 'CHAPA': '052369', 'NOME': 'MARINALDO CARDOSO ALVES', 'CPF': '05001314224', 'SECAO': 'CONTABILIDADE', 'FUNCAO': 'Estagiario Contabil', 'DATAADMISSAO': datetime.datetime(2025, 1, 22, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.002', 'CODFUNCAO': '000369', 'SALARIO': Decimal('600.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -2154}
{'CODCOLIGADA': 1, 'CHAPA': '051950', 'NOME': 'MARINEIDE BAILAO CORREA', 'CPF': '02778273298', 'SECAO': 'LOJA 10 OPERACIONAL', 'FUNCAO': 'Supervisor de Loja', 'DATAADMISSAO': datetime.datetime(2024, 7, 1, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '010.001.002', 'CODFUNCAO': '000240', 'SALARIO': Decimal('2724.51'), 'CODSINDICATO': '05', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -31709}
{'CODCOLIGADA': 1, 'CHAPA': '051502', 'NOME': 'MARINETH FERREIRA CORDOVIL', 'CPF': '61174696249', 'SECAO': 'LOJA 3 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2022, 10, 19, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '003.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 10402}
{'CODCOLIGADA': 2, 'CHAPA': '052611', 'NOME': 'MARINEUTON JASTER RODRIGUES', 'CPF': '08894944280', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2025, 11, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.003', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '051934', 'NOME': 'MARISTELA PEREIRA CARVALHO', 'CPF': '01862591237', 'SECAO': 'LOJA 10 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2024, 7, 1, 0, 0), 'CODSITUACAO': 'P', 'CODSECAO': '010.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '05', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '026127', 'NOME': 'MARIZETE CORREA DE SOUSA', 'CPF': '85123064249', 'SECAO': 'LOJA 3 OPERACIONAL', 'FUNCAO': 'Servicos Gerais', 'DATAADMISSAO': datetime.datetime(2022, 2, 1, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '003.001.002', 'CODFUNCAO': '000059', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 1272}
{'CODCOLIGADA': 1, 'CHAPA': '003952', 'NOME': 'MARLLESON GUILHERME DOS SANTOS DE JESUS', 'CPF': '06844389256', 'SECAO': 'LOJA 1 OPERACIONAL', 'FUNCAO': 'Supervisor Administrativo nível I', 'DATAADMISSAO': datetime.datetime(2022, 5, 13, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.002', 'CODFUNCAO': '000415', 'SALARIO': Decimal('2454.50'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 5450}
{'CODCOLIGADA': 2, 'CHAPA': '051799', 'NOME': 'MATEUS HENRIQUE DA SILVA CORREA', 'CPF': '06741597212', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Encarregado de Logistica Nivel I', 'DATAADMISSAO': datetime.datetime(2023, 12, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.003', 'CODFUNCAO': '000259', 'SALARIO': Decimal('1930.60'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 3, 'CHAPA': '052581', 'NOME': 'MATHEUS DA COSTA LEAL', 'CPF': '01480619230', 'SECAO': 'SEGURANCA PATRIMONIAL', 'FUNCAO': 'Fiscal de Loja', 'DATAADMISSAO': datetime.datetime(2025, 9, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.003', 'CODFUNCAO': '000116', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 28}
{'CODCOLIGADA': 1, 'CHAPA': '052150', 'NOME': 'MATHEUS LOPES DE CASTRO', 'CPF': '99922495287', 'SECAO': 'LOGISTICA ESTOQUE', 'FUNCAO': 'Assistente de Estoque IV', 'DATAADMISSAO': datetime.datetime(2024, 8, 16, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '006.003.013', 'CODFUNCAO': '000282', 'SALARIO': Decimal('1838.66'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 4553}
{'CODCOLIGADA': 2, 'CHAPA': '052222', 'NOME': 'MATHEUS SILVA GONCALVES', 'CPF': '05364235203', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2024, 10, 11, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.003', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 2, 'CHAPA': '052147', 'NOME': 'MAURICIO JORGE BRITO NASCIMENTO', 'CPF': '00348385200', 'SECAO': 'LOJA 2 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2024, 8, 16, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 3239}
{'CODCOLIGADA': 2, 'CHAPA': '004437', 'NOME': 'MAURICIO PENA DE SOUZA', 'CPF': '66175666291', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Encarregado de Logistica Nivel I', 'DATAADMISSAO': datetime.datetime(2019, 11, 21, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.003', 'CODFUNCAO': '000259', 'SALARIO': Decimal('1930.60'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 2, 'CHAPA': '052475', 'NOME': 'MAURO AFONSO CONCEICAO', 'CPF': '00460326228', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2025, 5, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.003', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 2, 'CHAPA': '051918', 'NOME': 'MAURO RAFAEL AMANAJAS MARINHO', 'CPF': '70103013288', 'SECAO': 'LOGISTICA OPERACIONAL BR', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2024, 5, 15, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.005', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 2, 'CHAPA': '044912', 'NOME': 'MAURO SERGIO DA CRUZ SOUZA', 'CPF': '69981833215', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Encarregado de Logistica Nivel I', 'DATAADMISSAO': datetime.datetime(2021, 12, 6, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.003', 'CODFUNCAO': '000259', 'SALARIO': Decimal('1930.60'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '052490', 'NOME': 'MAX CARNEIRO ARAUJO', 'CPF': '70454145284', 'SECAO': 'LOJA 10 OPERACIONAL', 'FUNCAO': 'Auxiliar de Estoque Nivel I', 'DATAADMISSAO': datetime.datetime(2025, 5, 6, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '010.001.002', 'CODFUNCAO': '000280', 'SALARIO': Decimal('1780.00'), 'CODSINDICATO': '05', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 10291}
{'CODCOLIGADA': 1, 'CHAPA': '051831', 'NOME': 'MAYARA AGRA DOS SANTOS', 'CPF': '84539232215', 'SECAO': 'LOJA 4 OPERACIONAL', 'FUNCAO': 'Operador de Caixa', 'DATAADMISSAO': datetime.datetime(2024, 1, 18, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '004.001.002', 'CODFUNCAO': '000042', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 11757}
{'CODCOLIGADA': 2, 'CHAPA': '052594', 'NOME': 'MAYARA CRISTINA DOS SANTOS RIBEIRO', 'CPF': '02793705209', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Assistente de Logistica Nivel I', 'DATAADMISSAO': datetime.datetime(2025, 10, 6, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.003', 'CODFUNCAO': '000238', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '051645', 'NOME': 'MAYARA DO ESPIRITO SANTO GALDEZ', 'CPF': '02697735259', 'SECAO': 'LOJA 3 OPERACIONAL', 'FUNCAO': 'ASSISTENTE DE CREDITO', 'DATAADMISSAO': datetime.datetime(2023, 5, 16, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '003.001.002', 'CODFUNCAO': '000134', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 3539}
{'CODCOLIGADA': 1, 'CHAPA': '003364', 'NOME': 'MAYCK VINICIUS NASCIMENTO DOS SANTOS', 'CPF': '03343426270', 'SECAO': 'LOJA 2 OPERACIONAL', 'FUNCAO': 'Auxiliar de Estoque Nivel I', 'DATAADMISSAO': datetime.datetime(2021, 9, 2, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '002.001.002', 'CODFUNCAO': '000280', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 18058}
{'CODCOLIGADA': 2, 'CHAPA': '051894', 'NOME': 'MAYCON DOUGLAS SOUSA NEGRAO', 'CPF': '06549559219', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2024, 4, 15, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 2, 'CHAPA': '052494', 'NOME': 'MAYCON PEREIRA DA SILVA', 'CPF': '03263247204', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2025, 5, 6, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.003', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '051610', 'NOME': 'MERIAM PAMPLONA DA COSTA', 'CPF': '62957368234', 'SECAO': 'LOJA 5 OPERACIONAL', 'FUNCAO': 'ASSISTENTE DE CREDITO', 'DATAADMISSAO': datetime.datetime(2023, 4, 3, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '005.001.002', 'CODFUNCAO': '000134', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 6040}
{'CODCOLIGADA': 1, 'CHAPA': '003678', 'NOME': 'MESAQUE ABRAAO NASCIMENTO DOS SANTOS', 'CPF': '96364440215', 'SECAO': 'SEGURANCA PATRIMONIAL', 'FUNCAO': 'Fiscal de Loja', 'DATAADMISSAO': datetime.datetime(2018, 12, 14, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '006.003.010', 'CODFUNCAO': '000116', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -835}
{'CODCOLIGADA': 2, 'CHAPA': '051770', 'NOME': 'MICHEL DE JESUS SERRAO FERREIRA', 'CPF': '02075588252', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Assistente de Logistica Nivel IV', 'DATAADMISSAO': datetime.datetime(2023, 10, 20, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.003', 'CODFUNCAO': '000257', 'SALARIO': Decimal('1838.66'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '052370', 'NOME': 'MICHEL ICARO ALVES DOS SANTOS', 'CPF': '07373873278', 'SECAO': 'LOJA 1 OPERACIONAL', 'FUNCAO': 'APRENDIZ', 'DATAADMISSAO': datetime.datetime(2025, 1, 22, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.002', 'CODFUNCAO': '000038', 'SALARIO': Decimal('761.55'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -200}
{'CODCOLIGADA': 1, 'CHAPA': '052527', 'NOME': 'MICHEL RODRIGUES DA COSTA', 'CPF': '02889003248', 'SECAO': 'LOJA 10 LOGISTICA ', 'FUNCAO': 'Motoboy', 'DATAADMISSAO': datetime.datetime(2025, 5, 30, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '010.001.003', 'CODFUNCAO': '000032', 'SALARIO': Decimal('1780.00'), 'CODSINDICATO': '05', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 2609}
{'CODCOLIGADA': 2, 'CHAPA': '052537', 'NOME': 'MICHEL SOEIRO DE ARAUJO', 'CPF': '07859081296', 'SECAO': 'LOGISTICA ESTOQUE', 'FUNCAO': 'Analista de logistica Nivel III', 'DATAADMISSAO': datetime.datetime(2025, 6, 16, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.003.013', 'CODFUNCAO': '000254', 'SALARIO': Decimal('2251.85'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '052549', 'NOME': 'MICHELE GARCIA DE OLIVEIRA', 'CPF': '00687410223', 'SECAO': 'LOJA 5 OPERACIONAL', 'FUNCAO': 'Supervisor de Loja', 'DATAADMISSAO': datetime.datetime(2025, 7, 7, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '005.001.002', 'CODFUNCAO': '000240', 'SALARIO': Decimal('2724.51'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -480}
{'CODCOLIGADA': 5, 'CHAPA': '028', 'NOME': 'MICHELE GONCALVES PAIXAO', 'CPF': '66840279200', 'SECAO': 'COMPRAS', 'FUNCAO': 'Supervisor de compras Nível VII', 'DATAADMISSAO': datetime.datetime(2025, 5, 25, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '1.04', 'CODFUNCAO': '000362', 'SALARIO': Decimal('8000.00'), 'CODSINDICATO': '01', 'INICIOPER': None, 'FIMPER': None, 'SALDO_MINUTOS': None}
{'CODCOLIGADA': 2, 'CHAPA': '052162', 'NOME': 'MICHELLE CAROLINY NASCIMENTO PEREIRA', 'CPF': '01762911213', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Assistente de Logistica Nivel I', 'DATAADMISSAO': datetime.datetime(2024, 9, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.003', 'CODFUNCAO': '000238', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 5, 'CHAPA': '001', 'NOME': 'MICHELLY KETHLEN FERREIRA DE LIMA', 'CPF': '02957031213', 'SECAO': 'COMPRAS', 'FUNCAO': 'Gerente de compras Nivel VI', 'DATAADMISSAO': datetime.datetime(2023, 5, 1, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '1.04', 'CODFUNCAO': '000311', 'SALARIO': Decimal('8800.00'), 'CODSINDICATO': '01', 'INICIOPER': None, 'FIMPER': None, 'SALDO_MINUTOS': None}
{'CODCOLIGADA': 1, 'CHAPA': '003410', 'NOME': 'MIKE DA SILVA AMARO', 'CPF': '03121350250', 'SECAO': 'LOJA 4 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2018, 3, 11, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '004.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 598}
{'CODCOLIGADA': 1, 'CHAPA': '052637', 'NOME': 'MIKE WALLACE LIMA MATOS', 'CPF': '02050931247', 'SECAO': 'LOJA 5 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2026, 2, 5, 0, 0), 'CODSITUACAO': 'Z', 'CODSECAO': '005.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': None, 'FIMPER': None, 'SALDO_MINUTOS': None}
{'CODCOLIGADA': 2, 'CHAPA': '044933', 'NOME': 'MILENA DE ANDRADE ALIEVI', 'CPF': '09441405990', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Analista de Logistica Nivel I', 'DATAADMISSAO': datetime.datetime(2022, 2, 14, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.003', 'CODFUNCAO': '000253', 'SALARIO': Decimal('1930.60'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '052636', 'NOME': 'MIRLA TIELLE MENDES CONCEICAO', 'CPF': '02270233239', 'SECAO': 'LOJA 2 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2026, 2, 5, 0, 0), 'CODSITUACAO': 'Z', 'CODSECAO': '002.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': None, 'FIMPER': None, 'SALDO_MINUTOS': None}
{'CODCOLIGADA': 2, 'CHAPA': '051790', 'NOME': 'MISAEL DOS SANTOS SENADO', 'CPF': '04429632200', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Assistente de Estoque IV', 'DATAADMISSAO': datetime.datetime(2023, 11, 6, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.003', 'CODFUNCAO': '000282', 'SALARIO': Decimal('1838.66'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 2, 'CHAPA': '052332', 'NOME': 'MOISES COSTA PANTOJA', 'CPF': '67689191215', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Motorista Nivel I', 'DATAADMISSAO': datetime.datetime(2024, 12, 16, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000161', 'SALARIO': Decimal('2163.23'), 'CODSINDICATO': '02', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '003679', 'NOME': 'MOISES MORAES RESQUE', 'CPF': '67934250215', 'SECAO': 'LOJA 8 OPERACIONAL', 'FUNCAO': 'Gerente de Loja', 'DATAADMISSAO': datetime.datetime(2018, 12, 14, 0, 0), 'CODSITUACAO': 'F', 'CODSECAO': '008.001.002', 'CODFUNCAO': '000208', 'SALARIO': Decimal('3729.18'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 2, 'CHAPA': '051631', 'NOME': 'NADABE PACHECO SANTOS', 'CPF': '01853718254', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2023, 5, 2, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '003457', 'NOME': 'NAYARA CRISTINA SOUZA DOS SANTOS', 'CPF': '95213872204', 'SECAO': 'LOJA 5 OPERACIONAL', 'FUNCAO': 'Gerente de Loja', 'DATAADMISSAO': datetime.datetime(2021, 10, 19, 0, 0), 'CODSITUACAO': 'F', 'CODSECAO': '005.001.002', 'CODFUNCAO': '000208', 'SALARIO': Decimal('3729.18'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 20352}
{'CODCOLIGADA': 2, 'CHAPA': '052597', 'NOME': 'NELSON SANTOS DE ASSIS', 'CPF': '06256407210', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2025, 10, 15, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.003', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '002670', 'NOME': 'NIELLE LEANDRA DE SOUZA NASCIMENTO', 'CPF': '02641008246', 'SECAO': 'LOJA 3 OPERACIONAL', 'FUNCAO': 'Supervisor de Loja', 'DATAADMISSAO': datetime.datetime(2020, 5, 13, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '003.001.002', 'CODFUNCAO': '000240', 'SALARIO': Decimal('2724.51'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 11198}
{'CODCOLIGADA': 1, 'CHAPA': '036168', 'NOME': 'NORBERTO MALCHER DOS SANTOS', 'CPF': '41036050220', 'SECAO': 'LOJA 4 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2022, 5, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '004.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 6004}
{'CODCOLIGADA': 1, 'CHAPA': '051945', 'NOME': 'ODILENE DA SILVA PAZ', 'CPF': '86326732204', 'SECAO': 'LOJA 10 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2024, 7, 1, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '010.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '05', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 12274}
{'CODCOLIGADA': 1, 'CHAPA': '051949', 'NOME': 'ODILENE SANTOS ANDRÉ', 'CPF': '03987548290', 'SECAO': 'LOJA 10 OPERACIONAL', 'FUNCAO': 'Supervisor Administrativo nível I', 'DATAADMISSAO': datetime.datetime(2024, 7, 1, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '010.001.002', 'CODFUNCAO': '000415', 'SALARIO': Decimal('2454.50'), 'CODSINDICATO': '05', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 24142}
{'CODCOLIGADA': 1, 'CHAPA': '003357', 'NOME': 'ODINEI ROBSON PANTOJA NASCIMENTO', 'CPF': '72243104253', 'SECAO': 'LOJA 2 OPERACIONAL', 'FUNCAO': 'Auxiliar de Reposição Nivel II', 'DATAADMISSAO': datetime.datetime(2021, 1, 22, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '002.001.002', 'CODFUNCAO': '000426', 'SALARIO': Decimal('1660.56'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 13510}
{'CODCOLIGADA': 3, 'CHAPA': '003825', 'NOME': 'ODIVAL DE ALMEIDA QUARESMA', 'CPF': '93064721291', 'SECAO': 'LOGISTICA ESTOQUE', 'FUNCAO': 'Analista de Estoque Nivel I', 'DATAADMISSAO': datetime.datetime(2022, 5, 3, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.010', 'CODFUNCAO': '000246', 'SALARIO': Decimal('1930.60'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 2165}
{'CODCOLIGADA': 2, 'CHAPA': '052413', 'NOME': 'OTAVIO LUIZ CALDEIRA SILVA', 'CPF': '03599939233', 'SECAO': 'LOGISTICA SUPPLY', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2025, 2, 3, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.006', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -420}
{'CODCOLIGADA': 1, 'CHAPA': '052273', 'NOME': 'OZIEL MIRANDA PASTANA', 'CPF': '05398549219', 'SECAO': 'LOJA 9 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas Nivel VI', 'DATAADMISSAO': datetime.datetime(2024, 11, 18, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '009.001.002', 'CODFUNCAO': '000313', 'SALARIO': Decimal('2043.00'), 'CODSINDICATO': '03', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -2808}
{'CODCOLIGADA': 3, 'CHAPA': '052551', 'NOME': 'PAMELA DE NAZARE FARIAS', 'CPF': '02080607235', 'SECAO': 'GENTE E GESTAO', 'FUNCAO': 'Assistente de Gente e Gestão', 'DATAADMISSAO': datetime.datetime(2025, 7, 7, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.009', 'CODFUNCAO': '000395', 'SALARIO': Decimal('2128.57'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 1944}
{'CODCOLIGADA': 1, 'CHAPA': '052608', 'NOME': 'PATRICIA SANTANA DO CARMO', 'CPF': '79311261220', 'SECAO': 'LOJA 9 OPERACIONAL', 'FUNCAO': 'Assistente de Credito Nivel VI', 'DATAADMISSAO': datetime.datetime(2025, 11, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '009.001.002', 'CODFUNCAO': '000316', 'SALARIO': Decimal('2043.00'), 'CODSINDICATO': '03', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 659}
{'CODCOLIGADA': 2, 'CHAPA': '052237', 'NOME': 'PATRICK NASCIMENTO DE SOUZA', 'CPF': '55166911253', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2024, 10, 11, 0, 0), 'CODSITUACAO': 'F', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 2, 'CHAPA': '052398', 'NOME': 'PAULINO ANTONIO DA SILVEIRA NETO', 'CPF': '06893322208', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2025, 2, 3, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.003', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 2, 'CHAPA': '052623', 'NOME': 'PAULO CEZAR MEIRELES SAMPAIO', 'CPF': '04551119288', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2026, 1, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 2, 'CHAPA': '051759', 'NOME': 'PAULO DE TARSO CORREA LIMA', 'CPF': '96071060249', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Motorista Nivel I', 'DATAADMISSAO': datetime.datetime(2023, 10, 5, 0, 0), 'CODSITUACAO': 'F', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000161', 'SALARIO': Decimal('2163.23'), 'CODSINDICATO': '02', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '052633', 'NOME': 'PAULO ERIC AMORIM DE BARROS', 'CPF': '08790157214', 'SECAO': 'GENTE E GESTAO', 'FUNCAO': 'APRENDIZ', 'DATAADMISSAO': datetime.datetime(2026, 1, 19, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '006.003.011', 'CODFUNCAO': '000038', 'SALARIO': Decimal('761.55'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 2, 'CHAPA': '052472', 'NOME': 'PAULO HENRIQUE SILVA GONCALVES', 'CPF': '04967228240', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2025, 4, 15, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.003', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 2, 'CHAPA': '052396', 'NOME': 'PAULO JOLRAN LIMA MELO DE JESUS', 'CPF': '04711993207', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2025, 2, 3, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.003', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '051609', 'NOME': 'PAULO REINALDO RUFINO DE JESUS', 'CPF': '80534953204', 'SECAO': 'LOJA 4 OPERACIONAL', 'FUNCAO': 'Auxiliar de Reposição', 'DATAADMISSAO': datetime.datetime(2023, 4, 3, 0, 0), 'CODSITUACAO': 'P', 'CODSECAO': '004.001.002', 'CODFUNCAO': '000327', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -1176}
{'CODCOLIGADA': 1, 'CHAPA': '003661', 'NOME': 'PAULO RICARDO SIDONIO GOMES', 'CPF': '02447966296', 'SECAO': 'LOJA 5 OPERACIONAL', 'FUNCAO': 'Supervisor de Estoque Nivel II', 'DATAADMISSAO': datetime.datetime(2017, 11, 14, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '005.001.002', 'CODFUNCAO': '000168', 'SALARIO': Decimal('2724.51'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '044864', 'NOME': 'PAULO ROBERTO ALVES BARROSO', 'CPF': '75513390272', 'SECAO': 'LOJA 4 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2021, 8, 10, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '004.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 12241}
{'CODCOLIGADA': 2, 'CHAPA': '051657', 'NOME': 'PAULO ROBERTO DA SILVA GARCIA', 'CPF': '53775570268', 'SECAO': 'LOGISTICA OPERACIONAL BR', 'FUNCAO': 'Encarregado de Logistica Nivel I', 'DATAADMISSAO': datetime.datetime(2023, 6, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.005', 'CODFUNCAO': '000259', 'SALARIO': Decimal('1930.60'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 2, 'CHAPA': '044882', 'NOME': 'PAULO ROBERTO GOMES DOS SANTOS', 'CPF': '37111108272', 'SECAO': 'LOGISTICA OPERACIONAL BR', 'FUNCAO': 'Supervisor de logística Nivel II', 'DATAADMISSAO': datetime.datetime(2021, 9, 1, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.005', 'CODFUNCAO': '000261', 'SALARIO': Decimal('2724.51'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 2, 'CHAPA': '052138', 'NOME': 'PAULO SERGIO CHARCHA FIGUEIREDO FILHO', 'CPF': '70232429294', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2024, 8, 6, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 2, 'CHAPA': '052235', 'NOME': 'PAULO SERGIO DA SILVA SANTOS', 'CPF': '85048380215', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2024, 10, 11, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 2, 'CHAPA': '044893', 'NOME': 'PAULO SERGIO DO VALE', 'CPF': '01794913262', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2021, 10, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -1211}
{'CODCOLIGADA': 2, 'CHAPA': '052040', 'NOME': 'PAULO SERGIO FERREIRA BORCEM', 'CPF': '86018361272', 'SECAO': 'LOJA 2 OPERACIONAL', 'FUNCAO': 'Auxiliar de Estoque Nivel I', 'DATAADMISSAO': datetime.datetime(2024, 6, 28, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.002', 'CODFUNCAO': '000280', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 2, 'CHAPA': '044940', 'NOME': 'PAULO SERGIO MIRANDA TEIXEIRA', 'CPF': '35276339287', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2022, 3, 29, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 3, 'CHAPA': '051854', 'NOME': 'PAULO VICTOR DOS PASSOS BRAGA', 'CPF': '01852082232', 'SECAO': 'LOJA 7 OPERACIONAL', 'FUNCAO': 'Assistente Administrativo I', 'DATAADMISSAO': datetime.datetime(2024, 2, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.008', 'CODFUNCAO': '000370', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 1427}
{'CODCOLIGADA': 2, 'CHAPA': '052582', 'NOME': 'PAULO VICTOR OLIVEIRA ESTUMANO', 'CPF': '02465618237', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2025, 9, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '052257', 'NOME': 'PEDRO EMMANUEL DOS SANTOS SERRAO', 'CPF': '01243650273', 'SECAO': 'LOJA 1 OPERACIONAL', 'FUNCAO': 'Auxiliar de Estoque Nivel I', 'DATAADMISSAO': datetime.datetime(2024, 11, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.002', 'CODFUNCAO': '000280', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 4860}
{'CODCOLIGADA': 1, 'CHAPA': '026129', 'NOME': 'PEDRO GABRIEL CORDEIRO LIMA', 'CPF': '02632068231', 'SECAO': 'LOJA 3 OPERACIONAL', 'FUNCAO': 'Repositor de Mercadoria', 'DATAADMISSAO': datetime.datetime(2022, 4, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '003.001.002', 'CODFUNCAO': '000043', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 2418}
{'CODCOLIGADA': 2, 'CHAPA': '052103', 'NOME': 'PEDRO HENRIQUE DA CONCEICAO ALVES', 'CPF': '03645102264', 'SECAO': 'LOGISTICA SUPPLY', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2024, 7, 26, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.006', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '052548', 'NOME': 'PEDRO HENRIQUE FONSECA ALBERNAZ', 'CPF': '03508117251', 'SECAO': 'LOJA 3 OPERACIONAL', 'FUNCAO': 'Auxiliar de Estoque Nivel I', 'DATAADMISSAO': datetime.datetime(2025, 7, 16, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '003.001.002', 'CODFUNCAO': '000280', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 99}
{'CODCOLIGADA': 1, 'CHAPA': '052427', 'NOME': 'PEDRO LUCCAS CARVALHO BRITO', 'CPF': '05234610209', 'SECAO': 'LOJA 9 OPERACIONAL', 'FUNCAO': 'Repositor de mercadorias Nivel VI', 'DATAADMISSAO': datetime.datetime(2025, 2, 10, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '009.001.002', 'CODFUNCAO': '000320', 'SALARIO': Decimal('2043.00'), 'CODSINDICATO': '03', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -4131}
{'CODCOLIGADA': 2, 'CHAPA': '052501', 'NOME': 'PEDRO PAULO FERREIRA DE OLIVEIRA', 'CPF': '03308912279', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2025, 5, 12, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 2, 'CHAPA': '051906', 'NOME': 'PERCILIANO EVANGELISTA FILHO', 'CPF': '88233618268', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2024, 5, 6, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.003', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 2, 'CHAPA': '052215', 'NOME': 'QUIONIS ARAUJO DA SILVA', 'CPF': '01544371233', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Servicos Gerais', 'DATAADMISSAO': datetime.datetime(2024, 10, 7, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.003', 'CODFUNCAO': '000165', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '052312', 'NOME': 'QUITERIA MARIA DA CONCEIÇÃO NETA', 'CPF': '75068125172', 'SECAO': 'LOJA 9 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas Nivel VI', 'DATAADMISSAO': datetime.datetime(2024, 12, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '009.001.002', 'CODFUNCAO': '000313', 'SALARIO': Decimal('2043.00'), 'CODSINDICATO': '03', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 4398}
{'CODCOLIGADA': 2, 'CHAPA': '051911', 'NOME': 'RAFAEL DE OLIVEIRA DOS SANTOS BRITO', 'CPF': '06431438230', 'SECAO': 'LOGISTICA OPERACIONAL BR', 'FUNCAO': 'Analista de Logistica Nivel I', 'DATAADMISSAO': datetime.datetime(2024, 5, 6, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.005', 'CODFUNCAO': '000253', 'SALARIO': Decimal('1930.60'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '005728', 'NOME': 'RAFAEL DO NASCIMENTO LIMA', 'CPF': '82536295249', 'SECAO': 'LOJA 9 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas Nivel VI', 'DATAADMISSAO': datetime.datetime(2021, 12, 20, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '009.001.002', 'CODFUNCAO': '000313', 'SALARIO': Decimal('2043.00'), 'CODSINDICATO': '03', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 1604}
{'CODCOLIGADA': 1, 'CHAPA': '051604', 'NOME': 'RAFAEL REIS LIMA', 'CPF': '02434910262', 'SECAO': 'LOJA 5 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2023, 3, 17, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '005.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 5939}
{'CODCOLIGADA': 2, 'CHAPA': '044881', 'NOME': 'RAFAEL RODRIGUES DOS SANTOS', 'CPF': '03529407275', 'SECAO': 'LOJA 3 OPERACIONAL', 'FUNCAO': 'Supervisor de Estoque Nivel II', 'DATAADMISSAO': datetime.datetime(2021, 9, 1, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.003', 'CODFUNCAO': '000168', 'SALARIO': Decimal('2724.51'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 21328}
{'CODCOLIGADA': 1, 'CHAPA': '051960', 'NOME': 'RAFAEL SANTOS DA SILVA', 'CPF': '04151907203', 'SECAO': 'LOJA 10 OPERACIONAL', 'FUNCAO': 'Auxiliar de Estoque Nivel I', 'DATAADMISSAO': datetime.datetime(2024, 7, 1, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '010.001.002', 'CODFUNCAO': '000280', 'SALARIO': Decimal('1780.00'), 'CODSINDICATO': '05', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 11189}
{'CODCOLIGADA': 1, 'CHAPA': '003437', 'NOME': 'RAFAEL SILVA MONTEIRO', 'CPF': '72476338249', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Supervisor de logística Nivel I', 'DATAADMISSAO': datetime.datetime(2020, 9, 18, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '006.004.004', 'CODFUNCAO': '000271', 'SALARIO': Decimal('2454.50'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 1395}
{'CODCOLIGADA': 1, 'CHAPA': '051444', 'NOME': 'RAFAELA DA SILVA DE SOUZA SALES', 'CPF': '02673683216', 'SECAO': 'LOJA 8 OPERACIONAL', 'FUNCAO': 'Supervisor Administrativo nível I', 'DATAADMISSAO': datetime.datetime(2021, 10, 18, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '008.001.002', 'CODFUNCAO': '000415', 'SALARIO': Decimal('2454.50'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 6403}
{'CODCOLIGADA': 1, 'CHAPA': '051827', 'NOME': 'RAFAELA MARIANA ALBUQUERQUE GOMES', 'CPF': '01613445261', 'SECAO': 'LOJA 8 OPERACIONAL', 'FUNCAO': 'Operador de Caixa', 'DATAADMISSAO': datetime.datetime(2024, 1, 18, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '008.001.002', 'CODFUNCAO': '000042', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 1563}
{'CODCOLIGADA': 5, 'CHAPA': '008', 'NOME': 'RAFAELA MERICIA MENDES DA SILVA', 'CPF': '95295593215', 'SECAO': 'EXPANSAO E MANUTENCAO', 'FUNCAO': 'Engenheiro (a) Civil', 'DATAADMISSAO': datetime.datetime(2023, 11, 1, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '1.10', 'CODFUNCAO': '000393', 'SALARIO': Decimal('5031.12'), 'CODSINDICATO': '01', 'INICIOPER': None, 'FIMPER': None, 'SALDO_MINUTOS': None}
{'CODCOLIGADA': 1, 'CHAPA': '036136', 'NOME': 'RAIMUNDA NONATA VERAS DA SILVA', 'CPF': '61563951215', 'SECAO': 'LOJA 4 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2020, 10, 13, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '004.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 3039}
{'CODCOLIGADA': 2, 'CHAPA': '044934', 'NOME': 'RAIMUNDO AUGUSTO SANTOS RIBEIRO', 'CPF': '59117850215', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Supervisor de logística Nivel II', 'DATAADMISSAO': datetime.datetime(2022, 2, 1, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.003', 'CODFUNCAO': '000261', 'SALARIO': Decimal('2724.51'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '051777', 'NOME': 'RAIMUNDO NONATO DA SILVA MENDONCA', 'CPF': '31848532253', 'SECAO': 'LOJA 4 OPERACIONAL', 'FUNCAO': 'Servicos Gerais', 'DATAADMISSAO': datetime.datetime(2023, 10, 24, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '004.001.002', 'CODFUNCAO': '000059', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 3679}
{'CODCOLIGADA': 1, 'CHAPA': '051431', 'NOME': 'RAIMUNDO NONATO NEVES FARIAS', 'CPF': '78056152253', 'SECAO': 'LOJA 8 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2021, 7, 12, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '008.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 5375}
{'CODCOLIGADA': 1, 'CHAPA': '052353', 'NOME': 'RAIMUNDO VITOR RODRIGUES CARDOSO', 'CPF': '08983753200', 'SECAO': 'LOJA 8 OPERACIONAL', 'FUNCAO': 'APRENDIZ', 'DATAADMISSAO': datetime.datetime(2025, 1, 6, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '008.001.002', 'CODFUNCAO': '000038', 'SALARIO': Decimal('761.55'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -891}
{'CODCOLIGADA': 1, 'CHAPA': '003433', 'NOME': 'RALDAN SANTANA DE CASTRO', 'CPF': '85025240204', 'SECAO': 'LOJA 1 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2020, 7, 1, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 8286}
{'CODCOLIGADA': 1, 'CHAPA': '005731', 'NOME': 'RAQUEL BATISTA BESSA', 'CPF': '04805822465', 'SECAO': 'LOJA 9 OPERACIONAL', 'FUNCAO': 'Servicos Gerais', 'DATAADMISSAO': datetime.datetime(2021, 12, 27, 0, 0), 'CODSITUACAO': 'P', 'CODSECAO': '009.001.002', 'CODFUNCAO': '000059', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '03', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 1008}
{'CODCOLIGADA': 1, 'CHAPA': '051124', 'NOME': 'RAQUEL MOTA LOBATO', 'CPF': '71624309291', 'SECAO': 'LOJA 3 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2021, 7, 12, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '003.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 14939}
{'CODCOLIGADA': 3, 'CHAPA': '000011', 'NOME': 'RENAN FROES DE CARVALHO', 'CPF': '00512643237', 'SECAO': 'CONTABILIDADE', 'FUNCAO': 'Analista Contábil Nível III', 'DATAADMISSAO': datetime.datetime(2022, 3, 18, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.002', 'CODFUNCAO': '04', 'SALARIO': Decimal('2251.85'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 111}
{'CODCOLIGADA': 2, 'CHAPA': '052231', 'NOME': 'RENAN HENRIQUE DOS SANTOS FERREIRA', 'CPF': '01397472227', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2024, 10, 11, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '051956', 'NOME': 'RENAN PINHEIRO SENA', 'CPF': '08182563208', 'SECAO': 'LOJA 10 OPERACIONAL', 'FUNCAO': 'Auxiliar de Reposição', 'DATAADMISSAO': datetime.datetime(2024, 7, 1, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '010.001.002', 'CODFUNCAO': '000327', 'SALARIO': Decimal('1780.00'), 'CODSINDICATO': '05', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 7574}
{'CODCOLIGADA': 1, 'CHAPA': '051480', 'NOME': 'RENAN SOUSA DA SILVA', 'CPF': '05267630276', 'SECAO': 'LOJA 10 OPERACIONAL', 'FUNCAO': 'Supervisor de Estoque Nivel II', 'DATAADMISSAO': datetime.datetime(2022, 8, 16, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '010.001.002', 'CODFUNCAO': '000168', 'SALARIO': Decimal('2724.51'), 'CODSINDICATO': '05', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 9393}
{'CODCOLIGADA': 1, 'CHAPA': '002677', 'NOME': 'RENATO BATISTA COSTA', 'CPF': '90061357200', 'SECAO': 'LOJA 4 OPERACIONAL', 'FUNCAO': 'Gerente de Loja', 'DATAADMISSAO': datetime.datetime(2020, 7, 1, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '004.001.002', 'CODFUNCAO': '000208', 'SALARIO': Decimal('3729.18'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 2, 'CHAPA': '052247', 'NOME': 'RENATO SILVA DE SOUZA', 'CPF': '80546013287', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Operador de Empilhadeira Nivel I', 'DATAADMISSAO': datetime.datetime(2024, 10, 11, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.003', 'CODFUNCAO': '000377', 'SALARIO': Decimal('2085.05'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 2, 'CHAPA': '052334', 'NOME': 'RHUAN ROMERO CASCAES BARROS', 'CPF': '92091512249', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Motorista Nivel I', 'DATAADMISSAO': datetime.datetime(2024, 12, 16, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000161', 'SALARIO': Decimal('2163.23'), 'CODSINDICATO': '02', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 2, 'CHAPA': '052228', 'NOME': 'RICARDO DO NASCIMENTO BAIA', 'CPF': '70055751210', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2024, 10, 11, 0, 0), 'CODSITUACAO': 'V', 'CODSECAO': '001.004.003', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '051957', 'NOME': 'RICHARDSON SILVA PINTO', 'CPF': '06870760217', 'SECAO': 'LOJA 10 OPERACIONAL', 'FUNCAO': 'Auxiliar de Reposição', 'DATAADMISSAO': datetime.datetime(2024, 7, 1, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '010.001.002', 'CODFUNCAO': '000327', 'SALARIO': Decimal('1780.00'), 'CODSINDICATO': '05', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 13421}
{'CODCOLIGADA': 2, 'CHAPA': '052621', 'NOME': 'RILEY GARDSON PINTO MORAIS JUNIOR', 'CPF': '55194869215', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2025, 12, 20, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.003', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '051812', 'NOME': 'RITA DE CASSIA DA SILVA GRANJEIRA DE OLIVEIRA', 'CPF': '48946958391', 'SECAO': 'COMERCIAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2024, 1, 1, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '006.003.014', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 6070}
{'CODCOLIGADA': 1, 'CHAPA': '051902', 'NOME': 'RIVELINO AUGUSTO SANTANA LIMA', 'CPF': '57384452287', 'SECAO': 'LOJA 4 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2024, 5, 6, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '004.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 6037}
{'CODCOLIGADA': 2, 'CHAPA': '052502', 'NOME': 'ROBENILSON DO NASCIMENTO SANTOS', 'CPF': '99301695200', 'SECAO': 'EXPANSAO E MANUTENCAO', 'FUNCAO': 'Servicos Gerais', 'DATAADMISSAO': datetime.datetime(2025, 5, 15, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.003.012', 'CODFUNCAO': '000165', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 3, 'CHAPA': '052033', 'NOME': 'ROBERTO DE OLIVEIRA NASCIMENTO', 'CPF': '66185718200', 'SECAO': 'SEGURANCA PATRIMONIAL', 'FUNCAO': 'Fiscal de Loja', 'DATAADMISSAO': datetime.datetime(2024, 6, 28, 0, 0), 'CODSITUACAO': 'F', 'CODSECAO': '001.001.003', 'CODFUNCAO': '000116', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 2220}
{'CODCOLIGADA': 1, 'CHAPA': '036116', 'NOME': 'ROBSON DA SILVA RAMALHO', 'CPF': '02165375258', 'SECAO': 'LOJA 4 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2020, 7, 3, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '004.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 7397}
{'CODCOLIGADA': 1, 'CHAPA': '003951', 'NOME': 'ROBSON GALHARDO GOMES', 'CPF': '72453150278', 'SECAO': 'LOJA 4 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2022, 1, 12, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '004.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 1506}
{'CODCOLIGADA': 1, 'CHAPA': '036135', 'NOME': 'ROBSON SOARES DE SOUZA', 'CPF': '77793811291', 'SECAO': 'LOJA 5 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2020, 10, 13, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '005.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 5228}
{'CODCOLIGADA': 2, 'CHAPA': '044884', 'NOME': 'RODENYL VINAGRE DINIZ', 'CPF': '91997968215', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Motorista Nivel II', 'DATAADMISSAO': datetime.datetime(2021, 9, 1, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000284', 'SALARIO': Decimal('2787.22'), 'CODSINDICATO': '02', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '036100', 'NOME': 'RODOLFO RODRIGO NEVES DE OLIVEIRA', 'CPF': '00056032269', 'SECAO': 'LOJA 4 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2019, 10, 1, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '004.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 1250}
{'CODCOLIGADA': 3, 'CHAPA': '003852', 'NOME': 'RODRIGO JORGE BARBOSA RAMOS', 'CPF': '95553002249', 'SECAO': 'SEGURANCA PATRIMONIAL', 'FUNCAO': 'Fiscal de Loja', 'DATAADMISSAO': datetime.datetime(2022, 11, 14, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.003', 'CODFUNCAO': '000116', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 3082}
{'CODCOLIGADA': 1, 'CHAPA': '003356', 'NOME': 'RODRIGO LAGO RODRIGUES', 'CPF': '02597600211', 'SECAO': 'LOJA 2 OPERACIONAL', 'FUNCAO': 'Supervisor de Estoque Nivel II', 'DATAADMISSAO': datetime.datetime(2020, 11, 12, 0, 0), 'CODSITUACAO': 'F', 'CODSECAO': '002.001.002', 'CODFUNCAO': '000168', 'SALARIO': Decimal('2724.51'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 10470}
{'CODCOLIGADA': 2, 'CHAPA': '051673', 'NOME': 'RODRIGO MENDES QUEIROZ', 'CPF': '04785727276', 'SECAO': 'LOGISTICA ESTOQUE', 'FUNCAO': 'Assistente de Estoque IV', 'DATAADMISSAO': datetime.datetime(2023, 7, 17, 0, 0), 'CODSITUACAO': 'F', 'CODSECAO': '001.003.013', 'CODFUNCAO': '000282', 'SALARIO': Decimal('1838.66'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 4327}
{'CODCOLIGADA': 2, 'CHAPA': '051808', 'NOME': 'RODRIGO PEREIRA DA SILVA', 'CPF': '70011372273', 'SECAO': 'LOJA 9 OPERACIONAL', 'FUNCAO': 'Operador de Empilhadeira Nivel I', 'DATAADMISSAO': datetime.datetime(2023, 12, 15, 0, 0), 'CODSITUACAO': 'F', 'CODSECAO': '001.001.009', 'CODFUNCAO': '000377', 'SALARIO': Decimal('2085.05'), 'CODSINDICATO': '03', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 2, 'CHAPA': '052516', 'NOME': 'RODRIGO RODRIGUES DE LIMA', 'CPF': '07285176206', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2025, 5, 23, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.003', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 2, 'CHAPA': '052328', 'NOME': 'RODRIGO SANTOS PEREIRA', 'CPF': '63564052364', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2024, 12, 16, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '051628', 'NOME': 'ROGERIO MELO DOS REMEDIOS', 'CPF': '01582333289', 'SECAO': 'LOJA 9 LOGISTICA', 'FUNCAO': 'Motorista Nivel I', 'DATAADMISSAO': datetime.datetime(2023, 5, 2, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '009.001.003', 'CODFUNCAO': '000161', 'SALARIO': Decimal('2163.23'), 'CODSINDICATO': '03', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 11033}
{'CODCOLIGADA': 1, 'CHAPA': '052586', 'NOME': 'ROGERIO SILVA COSTA', 'CPF': '07972003203', 'SECAO': 'LOJA 4 OPERACIONAL', 'FUNCAO': 'Servicos Gerais', 'DATAADMISSAO': datetime.datetime(2025, 9, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '004.001.002', 'CODFUNCAO': '000059', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 3879}
{'CODCOLIGADA': 1, 'CHAPA': '052348', 'NOME': 'RONALD FELIPE DE OLIVEIRA FARIAS', 'CPF': '08786960245', 'SECAO': 'LOJA 1 OPERACIONAL', 'FUNCAO': 'APRENDIZ', 'DATAADMISSAO': datetime.datetime(2025, 1, 6, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.002', 'CODFUNCAO': '000038', 'SALARIO': Decimal('761.55'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -176}
{'CODCOLIGADA': 1, 'CHAPA': '003333', 'NOME': 'RONALD FERREIRA BORCEM', 'CPF': '85711764268', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Motorista Nivel II', 'DATAADMISSAO': datetime.datetime(2018, 3, 20, 0, 0), 'CODSITUACAO': 'F', 'CODSECAO': '006.004.001', 'CODFUNCAO': '000284', 'SALARIO': Decimal('2787.22'), 'CODSINDICATO': '02', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '003418', 'NOME': 'RONALDO FIGUEIREDO DE MIRANDA', 'CPF': '46090576204', 'SECAO': 'LOJA 4 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2019, 1, 21, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '004.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 1928}
{'CODCOLIGADA': 2, 'CHAPA': '000446', 'NOME': 'RONALDO JOSE DE SOUSA', 'CPF': '26290200291', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Operador de Empilhadeira Nivel IV', 'DATAADMISSAO': datetime.datetime(2019, 1, 2, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.003', 'CODFUNCAO': '000164', 'SALARIO': Decimal('2199.39'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '052488', 'NOME': 'RONALDO MACHADO DE LIMA', 'CPF': '55267076287', 'SECAO': 'LOJA 10 OPERACIONAL', 'FUNCAO': 'Operador de Empilhadeira Nivel I', 'DATAADMISSAO': datetime.datetime(2025, 5, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '010.001.002', 'CODFUNCAO': '000377', 'SALARIO': Decimal('2085.05'), 'CODSINDICATO': '05', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -528}
{'CODCOLIGADA': 2, 'CHAPA': '044852', 'NOME': 'RONES DE JESUS SANTOS', 'CPF': '74913204220', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Motorista Nivel IV', 'DATAADMISSAO': datetime.datetime(2021, 7, 21, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000409', 'SALARIO': Decimal('4720.66'), 'CODSINDICATO': '02', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '003431', 'NOME': 'ROSANA DOS SANTOS MONTEIRO', 'CPF': '73772879268', 'SECAO': 'LOJA 1 OPERACIONAL', 'FUNCAO': 'Operador de Caixa', 'DATAADMISSAO': datetime.datetime(2020, 4, 14, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.002', 'CODFUNCAO': '000163', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 2262}
{'CODCOLIGADA': 1, 'CHAPA': '003354', 'NOME': 'ROSANE MONTEIRO MAURICIO', 'CPF': '00538624221', 'SECAO': 'LOJA 8 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2020, 8, 1, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '008.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 1895}
{'CODCOLIGADA': 1, 'CHAPA': '052543', 'NOME': 'ROSENILDA RIBEIRO FERREIRA', 'CPF': '97579076268', 'SECAO': 'LOJA 10 OPERACIONAL', 'FUNCAO': 'Operador de Caixa', 'DATAADMISSAO': datetime.datetime(2025, 6, 20, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '010.001.002', 'CODFUNCAO': '000042', 'SALARIO': Decimal('1780.00'), 'CODSINDICATO': '05', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 9756}
{'CODCOLIGADA': 5, 'CHAPA': '002', 'NOME': 'ROSIANE PELAES PINTO', 'CPF': '00500684235', 'SECAO': 'COMERCIAL', 'FUNCAO': 'Gerente Geral', 'DATAADMISSAO': datetime.datetime(2023, 5, 1, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '1.06', 'CODFUNCAO': '000343', 'SALARIO': Decimal('19565.46'), 'CODSINDICATO': '01', 'INICIOPER': None, 'FIMPER': None, 'SALDO_MINUTOS': None}
{'CODCOLIGADA': 1, 'CHAPA': '051460', 'NOME': 'ROSICLEA SOUZA DA SILVA', 'CPF': '86409638272', 'SECAO': 'LOJA 4 OPERACIONAL', 'FUNCAO': 'Supervisor de Loja', 'DATAADMISSAO': datetime.datetime(2022, 7, 1, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '004.001.002', 'CODFUNCAO': '000240', 'SALARIO': Decimal('2724.51'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 5843}
{'CODCOLIGADA': 1, 'CHAPA': '003373', 'NOME': 'ROSINEIDE FERREIRA DA SILVA', 'CPF': '87081849253', 'SECAO': 'LOJA 3 OPERACIONAL', 'FUNCAO': 'Supervisor Administrativo nível I', 'DATAADMISSAO': datetime.datetime(2022, 5, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '003.001.002', 'CODFUNCAO': '000415', 'SALARIO': Decimal('2454.50'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 5589}
{'CODCOLIGADA': 5, 'CHAPA': '024', 'NOME': 'RUI GREGORIO DA COSTA CASTRO', 'CPF': '66049636249', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Gerente de Logistica', 'DATAADMISSAO': datetime.datetime(2025, 1, 4, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '1.11', 'CODFUNCAO': '000047', 'SALARIO': Decimal('13000.00'), 'CODSINDICATO': '01', 'INICIOPER': None, 'FIMPER': None, 'SALDO_MINUTOS': None}
{'CODCOLIGADA': 2, 'CHAPA': '052108', 'NOME': 'SALOMAO HENRIQUE LOBO ABREU', 'CPF': '99009056287', 'SECAO': 'LOGISTICA SUPPLY', 'FUNCAO': 'Assistente de Logistica Nivel I', 'DATAADMISSAO': datetime.datetime(2024, 7, 26, 0, 0), 'CODSITUACAO': 'F', 'CODSECAO': '001.004.006', 'CODFUNCAO': '000238', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '052539', 'NOME': 'SAMYLLE DA SILVA PEREIRA', 'CPF': '06770085208', 'SECAO': 'LOJA 4 OPERACIONAL', 'FUNCAO': 'APRENDIZ', 'DATAADMISSAO': datetime.datetime(2025, 6, 18, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '004.001.002', 'CODFUNCAO': '000038', 'SALARIO': Decimal('761.55'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 627}
{'CODCOLIGADA': 2, 'CHAPA': '051528', 'NOME': 'SANDRO LUIZ CARDOSO FERREIRA', 'CPF': '04659411257', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2022, 12, 1, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '052123', 'NOME': 'SARAH EVELYN DE JESUS DE SOUZA', 'CPF': '08625865267', 'SECAO': 'LOJA 9 OPERACIONAL', 'FUNCAO': 'APRENDIZ', 'DATAADMISSAO': datetime.datetime(2024, 8, 12, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '009.001.002', 'CODFUNCAO': '000038', 'SALARIO': Decimal('761.55'), 'CODSINDICATO': '03', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -23}
{'CODCOLIGADA': 5, 'CHAPA': '017', 'NOME': 'SEBASTIAO RODRIGUES DA COSTA NETO', 'CPF': '01769541209', 'SECAO': 'LOGISTICA SUPPLY', 'FUNCAO': 'Gerente de Supply', 'DATAADMISSAO': datetime.datetime(2024, 8, 28, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '1.09', 'CODFUNCAO': '000399', 'SALARIO': Decimal('12000.00'), 'CODSINDICATO': '01', 'INICIOPER': None, 'FIMPER': None, 'SALDO_MINUTOS': None}
{'CODCOLIGADA': 2, 'CHAPA': '052054', 'NOME': 'SERGIO MAIA COELHO', 'CPF': '19196915889', 'SECAO': 'LOGISTICA OPERACIONAL BR', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2024, 7, 9, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.005', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -440}
{'CODCOLIGADA': 2, 'CHAPA': '004432', 'NOME': 'SERGIO SARDINHA CARVALHO', 'CPF': '79403891220', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2019, 11, 1, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '052479', 'NOME': 'SHEILA COSTA SANTOS', 'CPF': '91776384253', 'SECAO': 'LOJA 5 OPERACIONAL', 'FUNCAO': 'Servicos Gerais', 'DATAADMISSAO': datetime.datetime(2025, 4, 22, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '005.001.002', 'CODFUNCAO': '000059', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 3751}
{'CODCOLIGADA': 1, 'CHAPA': '003691', 'NOME': 'SHIRLENE DA SILVA CHERMONT', 'CPF': '75345501220', 'SECAO': 'LOJA 4 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2019, 3, 1, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '004.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 1752}
{'CODCOLIGADA': 1, 'CHAPA': '000578', 'NOME': 'SILMARA TRAVASSOS FURTADO', 'CPF': '01958519278', 'SECAO': 'LOJA 9 OPERACIONAL', 'FUNCAO': 'Assistente de Credito Nivel VI', 'DATAADMISSAO': datetime.datetime(2021, 11, 24, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '009.001.002', 'CODFUNCAO': '000316', 'SALARIO': Decimal('2043.00'), 'CODSINDICATO': '03', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 23164}
{'CODCOLIGADA': 1, 'CHAPA': '051947', 'NOME': 'SILVANA PEIXOTO SOARES', 'CPF': '77113330215', 'SECAO': 'LOJA 10 OPERACIONAL', 'FUNCAO': 'Operador de Caixa', 'DATAADMISSAO': datetime.datetime(2024, 7, 1, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '010.001.002', 'CODFUNCAO': '000042', 'SALARIO': Decimal('1780.00'), 'CODSINDICATO': '05', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 19021}
{'CODCOLIGADA': 1, 'CHAPA': '051688', 'NOME': 'SILVANA SILVA', 'CPF': '82346712272', 'SECAO': 'COMPRAS', 'FUNCAO': 'Analista de Compras IV', 'DATAADMISSAO': datetime.datetime(2023, 8, 7, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '006.003.006', 'CODFUNCAO': '000424', 'SALARIO': Decimal('2454.50'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 817}
{'CODCOLIGADA': 1, 'CHAPA': '003374', 'NOME': 'SILVIO JOSÉ DA SILVA LIMA', 'CPF': '78286182200', 'SECAO': 'LOJA 2 OPERACIONAL', 'FUNCAO': 'Repositor de Mercadoria', 'DATAADMISSAO': datetime.datetime(2022, 5, 3, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '002.001.002', 'CODFUNCAO': '000043', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 6400}
{'CODCOLIGADA': 1, 'CHAPA': '051699', 'NOME': 'SOCRATES SOUZA DA SILVA', 'CPF': '78888433287', 'SECAO': 'LOJA 8 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2023, 8, 16, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '008.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 557}
{'CODCOLIGADA': 1, 'CHAPA': '052635', 'NOME': 'SOLANGE DAS GRACAS CAVALCANTE FEIO', 'CPF': '32859740287', 'SECAO': 'LOJA 1 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2026, 2, 5, 0, 0), 'CODSITUACAO': 'Z', 'CODSECAO': '001.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': None, 'FIMPER': None, 'SALDO_MINUTOS': None}
{'CODCOLIGADA': 1, 'CHAPA': '051976', 'NOME': 'STHEFANY NATALIA SANTOS BRITO', 'CPF': '05712362279', 'SECAO': 'LOJA 4 OPERACIONAL', 'FUNCAO': 'Supervisor de Loja', 'DATAADMISSAO': datetime.datetime(2024, 6, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '004.001.002', 'CODFUNCAO': '000240', 'SALARIO': Decimal('2724.51'), 'CODSINDICATO': '01', 'INICIOPER': None, 'FIMPER': None, 'SALDO_MINUTOS': None}
{'CODCOLIGADA': 1, 'CHAPA': '002692', 'NOME': 'SUELLANE PINTO PEREIRA', 'CPF': '01729517200', 'SECAO': 'COMPRAS', 'FUNCAO': 'Analista de Compras I', 'DATAADMISSAO': datetime.datetime(2019, 12, 20, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '006.003.006', 'CODFUNCAO': '000402', 'SALARIO': Decimal('1930.60'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -1433}
{'CODCOLIGADA': 1, 'CHAPA': '002684', 'NOME': 'SUIANNY LISSANDRA FERREIRA MESSIAS', 'CPF': '73212393220', 'SECAO': 'LOJA 1 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2020, 8, 26, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 5277}
{'CODCOLIGADA': 1, 'CHAPA': '051647', 'NOME': 'TABITA MOTA DOS ANJOS', 'CPF': '07525617236', 'SECAO': 'LOJA 2 OPERACIONAL', 'FUNCAO': 'Operador de Caixa', 'DATAADMISSAO': datetime.datetime(2023, 5, 18, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '002.001.002', 'CODFUNCAO': '000042', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 8411}
{'CODCOLIGADA': 1, 'CHAPA': '051519', 'NOME': 'TALYSSA LIMA RIBEIRO', 'CPF': '03141394270', 'SECAO': 'LOJA 5 OPERACIONAL', 'FUNCAO': 'ASSISTENTE DE CREDITO', 'DATAADMISSAO': datetime.datetime(2022, 12, 1, 0, 0), 'CODSITUACAO': 'E', 'CODSECAO': '005.001.002', 'CODFUNCAO': '000134', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -164}
{'CODCOLIGADA': 1, 'CHAPA': '026113', 'NOME': 'TATIANA CAVALHEIRO GUIMARAES', 'CPF': '94383146287', 'SECAO': 'LOJA 7 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas Nivel IV', 'DATAADMISSAO': datetime.datetime(2021, 6, 2, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '007.001.002', 'CODFUNCAO': '000294', 'SALARIO': Decimal('1838.66'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -2075}
{'CODCOLIGADA': 1, 'CHAPA': '052509', 'NOME': 'TAYNA CLICIA DA SILVA DOS SANTOS', 'CPF': '05614264221', 'SECAO': 'LOJA 3 OPERACIONAL', 'FUNCAO': 'ASSISTENTE DE CREDITO', 'DATAADMISSAO': datetime.datetime(2025, 5, 15, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '003.001.002', 'CODFUNCAO': '000134', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 4739}
{'CODCOLIGADA': 2, 'CHAPA': '052544', 'NOME': 'THAIS CRISTINA DOS SANTOS MOURAO', 'CPF': '03695456213', 'SECAO': 'GENTE E GESTAO', 'FUNCAO': 'Tecnico de Segurança do Trabalho', 'DATAADMISSAO': datetime.datetime(2025, 6, 23, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.003.011', 'CODFUNCAO': '000360', 'SALARIO': Decimal('2454.50'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -981}
{'CODCOLIGADA': 1, 'CHAPA': '026102', 'NOME': 'THAIS DIAS PIRES', 'CPF': '94744610234', 'SECAO': 'LOJA 4 OPERACIONAL', 'FUNCAO': 'Operador de Caixa', 'DATAADMISSAO': datetime.datetime(2021, 1, 28, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '004.001.002', 'CODFUNCAO': '000163', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 5728}
{'CODCOLIGADA': 1, 'CHAPA': '051582', 'NOME': 'THAIS DO NASCIMENTO GOMES', 'CPF': '02995479226', 'SECAO': 'LOJA 1 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2023, 3, 1, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 877}
{'CODCOLIGADA': 3, 'CHAPA': '052568', 'NOME': 'THAIS DO SOCORRO MARCIEIRA MENDONCA', 'CPF': '89994272268', 'SECAO': 'SEGURANCA PATRIMONIAL', 'FUNCAO': 'Fiscal de Loja', 'DATAADMISSAO': datetime.datetime(2025, 3, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.003', 'CODFUNCAO': '000116', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 2268}
{'CODCOLIGADA': 3, 'CHAPA': '051925', 'NOME': 'THAISA SANDRA BARATA VILHENA', 'CPF': '01362662232', 'SECAO': 'COMPRAS', 'FUNCAO': 'Analista de Compras IV', 'DATAADMISSAO': datetime.datetime(2024, 5, 15, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.012', 'CODFUNCAO': '000421', 'SALARIO': Decimal('2454.50'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -5}
{'CODCOLIGADA': 1, 'CHAPA': '052278', 'NOME': 'THALISON ANDERSON RODRIGUES DA SILVA', 'CPF': '02519602260', 'SECAO': 'LOJA 9 OPERACIONAL', 'FUNCAO': 'Auxiliar de estoque Nivel V', 'DATAADMISSAO': datetime.datetime(2024, 11, 18, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '009.001.002', 'CODFUNCAO': '000321', 'SALARIO': Decimal('1851.00'), 'CODSINDICATO': '03', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 2, 'CHAPA': '051754', 'NOME': 'THALISON DO ROSARIO GOMES', 'CPF': '02444156250', 'SECAO': 'LOGISTICA SUPPLY', 'FUNCAO': 'Assistente de Logistica Nivel IV', 'DATAADMISSAO': datetime.datetime(2023, 10, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.006', 'CODFUNCAO': '000257', 'SALARIO': Decimal('1838.66'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 3, 'CHAPA': '051807', 'NOME': 'THAYNA AIRES ANDRADE', 'CPF': '01249032237', 'SECAO': 'CONTABILIDADE', 'FUNCAO': 'Supervisor de Contabilidade Nivel III', 'DATAADMISSAO': datetime.datetime(2023, 12, 15, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.002', 'CODFUNCAO': '000269', 'SALARIO': Decimal('2996.96'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '051503', 'NOME': 'THAYNA ALHO FARIAS', 'CPF': '03733237277', 'SECAO': 'FINANCEIRO', 'FUNCAO': 'Analista Financeiro Nivel III', 'DATAADMISSAO': datetime.datetime(2022, 10, 19, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '006.003.001', 'CODFUNCAO': '000368', 'SALARIO': Decimal('2251.85'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 530}
{'CODCOLIGADA': 2, 'CHAPA': '052209', 'NOME': 'THIAGO DOS SANTOS DA SILVA', 'CPF': '03493258208', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Assistente de Logistica Nivel IV', 'DATAADMISSAO': datetime.datetime(2024, 10, 7, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.003', 'CODFUNCAO': '000257', 'SALARIO': Decimal('1838.66'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 3, 'CHAPA': '052190', 'NOME': 'THIAGO FRANCA DE SOUZA', 'CPF': '04794468229', 'SECAO': 'LOJA 7 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas Nivel IV', 'DATAADMISSAO': datetime.datetime(2024, 10, 7, 0, 0), 'CODSITUACAO': 'F', 'CODSECAO': '001.001.008', 'CODFUNCAO': '000294', 'SALARIO': Decimal('1838.66'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 3456}
{'CODCOLIGADA': 2, 'CHAPA': '052500', 'NOME': 'THIAGO SARMENTO DE OLIVEIRA', 'CPF': '09977437270', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2025, 5, 12, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 2, 'CHAPA': '052499', 'NOME': 'THIAGO YURI DA SILVA SOARES', 'CPF': '04497608204', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2025, 5, 12, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '003311', 'NOME': 'THIEGO FREITAS MORAES', 'CPF': '00948133295', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Supervisor de logística Nivel II', 'DATAADMISSAO': datetime.datetime(2017, 11, 20, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '006.004.004', 'CODFUNCAO': '000261', 'SALARIO': Decimal('2724.51'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 1099}
{'CODCOLIGADA': 1, 'CHAPA': '051509', 'NOME': 'TIAGO JOSE FARIAS DOS SANTOS', 'CPF': '02438413298', 'SECAO': 'SEGURANCA PATRIMONIAL', 'FUNCAO': 'Fiscal de Loja', 'DATAADMISSAO': datetime.datetime(2022, 11, 9, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '006.003.010', 'CODFUNCAO': '000116', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 2509}
{'CODCOLIGADA': 1, 'CHAPA': '052538', 'NOME': 'TIAGO LISBOA BRASIL', 'CPF': '06807867247', 'SECAO': 'LOJA 4 OPERACIONAL', 'FUNCAO': 'APRENDIZ', 'DATAADMISSAO': datetime.datetime(2025, 6, 18, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '004.001.002', 'CODFUNCAO': '000038', 'SALARIO': Decimal('761.55'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 272}
{'CODCOLIGADA': 3, 'CHAPA': '051566', 'NOME': 'UTUPIRANI APRIGIO', 'CPF': '57569207220', 'SECAO': 'SEGURANCA PATRIMONIAL', 'FUNCAO': 'Fiscal de Loja', 'DATAADMISSAO': datetime.datetime(2023, 2, 6, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.003', 'CODFUNCAO': '000116', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 2420}
{'CODCOLIGADA': 2, 'CHAPA': '052241', 'NOME': 'VALBERTO SANTOS DE SOUZA', 'CPF': '70851824234', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Motorista Nivel I', 'DATAADMISSAO': datetime.datetime(2024, 10, 11, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000161', 'SALARIO': Decimal('2163.23'), 'CODSINDICATO': '02', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 3, 'CHAPA': '051996', 'NOME': 'VALDECIR DO NASCIMENTO CORREIA', 'CPF': '06935887216', 'SECAO': 'SEGURANCA PATRIMONIAL', 'FUNCAO': 'Fiscal de Loja', 'DATAADMISSAO': datetime.datetime(2024, 6, 21, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.003', 'CODFUNCAO': '000116', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 1030}
{'CODCOLIGADA': 1, 'CHAPA': '036147', 'NOME': 'VALDEILSON SANTA BRIGIDA FURTADO', 'CPF': '42874874272', 'SECAO': 'LOJA 4 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2021, 5, 15, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '004.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 10881}
{'CODCOLIGADA': 2, 'CHAPA': '044151', 'NOME': 'VALDEMAR REIS DO ROSARIO', 'CPF': '02575569230', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2021, 5, 24, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 2, 'CHAPA': '052097', 'NOME': 'VALDIR SENA DE OLIVEIRA', 'CPF': '75833514215', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2024, 7, 26, 0, 0), 'CODSITUACAO': 'P', 'CODSECAO': '001.004.003', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '052567', 'NOME': 'VANESSA SOUSA DE PAIVA', 'CPF': '01718744200', 'SECAO': 'LOJA 2 OPERACIONAL', 'FUNCAO': 'Gerente de Loja', 'DATAADMISSAO': datetime.datetime(2025, 2, 10, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '002.001.002', 'CODFUNCAO': '000208', 'SALARIO': Decimal('3729.18'), 'CODSINDICATO': '01', 'INICIOPER': None, 'FIMPER': None, 'SALDO_MINUTOS': None}
{'CODCOLIGADA': 2, 'CHAPA': '051756', 'NOME': 'VARLINDO CAMPOS BAIA', 'CPF': '64184293204', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2023, 10, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.003', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 2, 'CHAPA': '044891', 'NOME': 'VERISSIMO VILHENA DOS SANTOS', 'CPF': '63764938234', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2021, 10, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 2, 'CHAPA': '052010', 'NOME': 'VICTO LARANJEIRA GULART', 'CPF': '10848939328', 'SECAO': 'LOGISTICA SUPPLY', 'FUNCAO': 'Assistente de Logistica Nivel IV', 'DATAADMISSAO': datetime.datetime(2024, 6, 21, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.006', 'CODFUNCAO': '000257', 'SALARIO': Decimal('1838.66'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 2, 'CHAPA': '052578', 'NOME': 'VICTOR ALMEIDA DA SILVA', 'CPF': '06922534247', 'SECAO': 'LOGISTICA ESTOQUE', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2025, 9, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.002', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 2, 'CHAPA': '052514', 'NOME': 'VICTOR AUGUSTO SILVA MORAES', 'CPF': '70219671281', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2025, 5, 23, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.003', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 3, 'CHAPA': '052564', 'NOME': 'VICTOR HENRIQUE ARAUJO DE SOUZA', 'CPF': '05242956208', 'SECAO': 'MARKETING', 'FUNCAO': 'Analista de Marketing Nivel III', 'DATAADMISSAO': datetime.datetime(2025, 8, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.004', 'CODFUNCAO': '000332', 'SALARIO': Decimal('2251.85'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 300}
{'CODCOLIGADA': 2, 'CHAPA': '052305', 'NOME': 'VICTOR HUGO DA CUNHA SOARES', 'CPF': '05980173218', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2024, 11, 18, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 2, 'CHAPA': '051885', 'NOME': 'VICTOR HUGO DOS SANTOS DO NASCIMENTO', 'CPF': '06335963299', 'SECAO': 'LOJA 4 OPERACIONAL', 'FUNCAO': 'Auxiliar de Estoque Nivel I', 'DATAADMISSAO': datetime.datetime(2024, 4, 15, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.004', 'CODFUNCAO': '000280', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -2390}
{'CODCOLIGADA': 1, 'CHAPA': '052632', 'NOME': 'VICTOR MATHEUS PUREZA RODRIGUES', 'CPF': '08823913306', 'SECAO': 'LOJA 10 LOGISTICA ', 'FUNCAO': 'Assistente de Logistica Nivel IV', 'DATAADMISSAO': datetime.datetime(2026, 1, 19, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '010.001.003', 'CODFUNCAO': '000257', 'SALARIO': Decimal('1838.66'), 'CODSINDICATO': '05', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 2, 'CHAPA': '052573', 'NOME': 'VINICIOS DA SILVA CARVALHO', 'CPF': '14785377607', 'SECAO': 'LOGISTICA OPERACIONAL BR', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2025, 8, 20, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.005', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 2, 'CHAPA': '052504', 'NOME': 'VINICIUS DE MORAES DA SILVA', 'CPF': '05624907281', 'SECAO': 'LOGISTICA ESTOQUE', 'FUNCAO': 'Assistente de Logistica Nivel IV', 'DATAADMISSAO': datetime.datetime(2025, 5, 15, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.003.013', 'CODFUNCAO': '000257', 'SALARIO': Decimal('1838.66'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '052466', 'NOME': 'VINICIUS OLIMPIO NASCIMENTO DA SILVA', 'CPF': '70090102266', 'SECAO': 'LOJA 2 OPERACIONAL', 'FUNCAO': 'Auxiliar de Reposição', 'DATAADMISSAO': datetime.datetime(2025, 4, 4, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '002.001.002', 'CODFUNCAO': '000327', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -3764}
{'CODCOLIGADA': 1, 'CHAPA': '052382', 'NOME': 'VINICIUS RENAN COSTA RODRIGUES', 'CPF': '04477478275', 'SECAO': 'LOJA 4 OPERACIONAL', 'FUNCAO': 'Auxiliar de Estoque Nivel I', 'DATAADMISSAO': datetime.datetime(2025, 2, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '004.001.002', 'CODFUNCAO': '000280', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 1185}
{'CODCOLIGADA': 3, 'CHAPA': '052323', 'NOME': 'WALBER DO ESPIRITO SANTO BRITO', 'CPF': '95847391234', 'SECAO': 'SEGURANCA PATRIMONIAL', 'FUNCAO': 'Fiscal de Loja', 'DATAADMISSAO': datetime.datetime(2024, 12, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.003', 'CODFUNCAO': '000116', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -1705}
{'CODCOLIGADA': 3, 'CHAPA': '003848', 'NOME': 'WALDECY PANTOJA LOBATO', 'CPF': '66768934287', 'SECAO': 'EXPANSAO E MANUTENCAO', 'FUNCAO': 'Pedreiro Nivel I', 'DATAADMISSAO': datetime.datetime(2022, 11, 1, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.001', 'CODFUNCAO': '000327', 'SALARIO': Decimal('2197.46'), 'CODSINDICATO': '04', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -22824}
{'CODCOLIGADA': 1, 'CHAPA': '005730', 'NOME': 'WALDENIR DE SOUZA GUIMARAES', 'CPF': '58276874215', 'SECAO': 'LOJA 9 LOGISTICA', 'FUNCAO': 'Motorista Nivel I', 'DATAADMISSAO': datetime.datetime(2021, 12, 17, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '009.001.003', 'CODFUNCAO': '000161', 'SALARIO': Decimal('2163.23'), 'CODSINDICATO': '03', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 11284}
{'CODCOLIGADA': 1, 'CHAPA': '052532', 'NOME': 'WALISSON NUNES SILVA', 'CPF': '02233648277', 'SECAO': 'LOJA 9 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas Nivel VI', 'DATAADMISSAO': datetime.datetime(2025, 6, 6, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '009.001.002', 'CODFUNCAO': '000313', 'SALARIO': Decimal('2043.00'), 'CODSINDICATO': '03', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 5436}
{'CODCOLIGADA': 2, 'CHAPA': '052434', 'NOME': 'WALLACE DA SILVA TAVARES', 'CPF': '00962666270', 'SECAO': 'LOGISTICA ESTOQUE', 'FUNCAO': 'Assistente de Estoque IV', 'DATAADMISSAO': datetime.datetime(2025, 2, 17, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.003.013', 'CODFUNCAO': '000282', 'SALARIO': Decimal('1838.66'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 2, 'CHAPA': '004433', 'NOME': 'WALTER MAIA DA CONCEICAO', 'CPF': '45274797253', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Encarregado de Manunteção', 'DATAADMISSAO': datetime.datetime(2019, 11, 1, 0, 0), 'CODSITUACAO': 'F', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000346', 'SALARIO': Decimal('2165.24'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 3, 'CHAPA': '003847', 'NOME': 'WALWYLEN DOS SANTOS BARROSO', 'CPF': '79670822220', 'SECAO': 'SEGURANCA PATRIMONIAL', 'FUNCAO': 'Fiscal de Loja', 'DATAADMISSAO': datetime.datetime(2022, 11, 1, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.003', 'CODFUNCAO': '000116', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 424}
{'CODCOLIGADA': 1, 'CHAPA': '052182', 'NOME': 'WANDINEIA ALVES GONCALVES', 'CPF': '01654332216', 'SECAO': 'LOJA 4 OPERACIONAL', 'FUNCAO': 'Servicos Gerais', 'DATAADMISSAO': datetime.datetime(2024, 10, 7, 0, 0), 'CODSITUACAO': 'P', 'CODSECAO': '004.001.002', 'CODFUNCAO': '000059', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 958}
{'CODCOLIGADA': 2, 'CHAPA': '052216', 'NOME': 'WANESSA SERRAO DA SILVA', 'CPF': '00812082273', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Servicos Gerais', 'DATAADMISSAO': datetime.datetime(2024, 10, 7, 0, 0), 'CODSITUACAO': 'F', 'CODSECAO': '001.004.003', 'CODFUNCAO': '000165', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 2, 'CHAPA': '051986', 'NOME': 'WARLEN EDUARDO CARVALHO RODRIGUES', 'CPF': '05888668222', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Operador de Empilhadeira Nivel I', 'DATAADMISSAO': datetime.datetime(2024, 6, 17, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.003', 'CODFUNCAO': '000377', 'SALARIO': Decimal('2085.05'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 2, 'CHAPA': '052027', 'NOME': 'WARLEN SEBASTIAO DOS SANTOS VASCONCELOS', 'CPF': '70619645296', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2024, 6, 22, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.003', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '036150', 'NOME': 'WELITON FABRICIO SOUSA DA SILVA', 'CPF': '03621996206', 'SECAO': 'LOGISTICA ESTOQUE', 'FUNCAO': 'Assistente de Estoque IV', 'DATAADMISSAO': datetime.datetime(2021, 9, 2, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '006.003.013', 'CODFUNCAO': '000282', 'SALARIO': Decimal('1838.66'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 17988}
{'CODCOLIGADA': 3, 'CHAPA': '052424', 'NOME': 'WELLINGTON REIS PEREIRA', 'CPF': '06374139208', 'SECAO': 'SEGURANCA PATRIMONIAL', 'FUNCAO': 'Fiscal de Loja', 'DATAADMISSAO': datetime.datetime(2025, 2, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.003', 'CODFUNCAO': '000116', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 3198}
{'CODCOLIGADA': 1, 'CHAPA': '003682', 'NOME': 'WENDEL DO NASCIMENTO CARVALHO', 'CPF': '61789313287', 'SECAO': 'LOJA 4 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2019, 1, 2, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '004.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 2430}
{'CODCOLIGADA': 1, 'CHAPA': '052381', 'NOME': 'WENDEL PATRICK LIBONATI DIAS', 'CPF': '06264319210', 'SECAO': 'LOJA 4 OPERACIONAL', 'FUNCAO': 'Auxiliar de Estoque Nivel I', 'DATAADMISSAO': datetime.datetime(2025, 2, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '004.001.002', 'CODFUNCAO': '000280', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 8660}
{'CODCOLIGADA': 2, 'CHAPA': '052629', 'NOME': 'WENDELL DIAS DE SOUSA', 'CPF': '60519100263', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2026, 1, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 2, 'CHAPA': '052397', 'NOME': 'WENDELL KAUA RAMOS ALMEIDA', 'CPF': '04973473260', 'SECAO': 'LOGISTICA OPERACIONAL CEDL', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2025, 2, 3, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.003', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '051700', 'NOME': 'WENDERSON LUIZ DE LIMA PINTO', 'CPF': '07929257266', 'SECAO': 'LOGISTICA ESTOQUE', 'FUNCAO': 'Assistente de Logistica Nivel IV', 'DATAADMISSAO': datetime.datetime(2023, 8, 16, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '006.003.013', 'CODFUNCAO': '000257', 'SALARIO': Decimal('1838.66'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 2, 'CHAPA': '051757', 'NOME': 'WENDERSON RAFAEL SANTIAGO AMARAL', 'CPF': '05860543247', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2023, 10, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -3110}
{'CODCOLIGADA': 1, 'CHAPA': '052463', 'NOME': 'WENISSON WAGNER CARDOSO DE SOUZA', 'CPF': '00790314207', 'SECAO': 'LOJA 3 OPERACIONAL', 'FUNCAO': 'Auxiliar de Reposição', 'DATAADMISSAO': datetime.datetime(2025, 4, 4, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '003.001.002', 'CODFUNCAO': '000327', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 244}
{'CODCOLIGADA': 3, 'CHAPA': '052191', 'NOME': 'WESLEY BARROS DA SILVA', 'CPF': '04103756241', 'SECAO': 'LOJA 7 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas Nivel IV', 'DATAADMISSAO': datetime.datetime(2024, 10, 7, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.008', 'CODFUNCAO': '000294', 'SALARIO': Decimal('1838.66'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 10210}
{'CODCOLIGADA': 1, 'CHAPA': '002681', 'NOME': 'WESLEY SILVA DA SILVA', 'CPF': '05244779222', 'SECAO': 'LOJA 8 OPERACIONAL', 'FUNCAO': 'Consultor de Vendas', 'DATAADMISSAO': datetime.datetime(2020, 7, 21, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '008.001.002', 'CODFUNCAO': '000144', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 784}
{'CODCOLIGADA': 1, 'CHAPA': '052459', 'NOME': 'WESLLEY CORREA DIAS', 'CPF': '02940783209', 'SECAO': 'LOJA 10 OPERACIONAL', 'FUNCAO': 'Auxiliar de Reposição', 'DATAADMISSAO': datetime.datetime(2025, 4, 4, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '010.001.002', 'CODFUNCAO': '000327', 'SALARIO': Decimal('1780.00'), 'CODSINDICATO': '05', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 6514}
{'CODCOLIGADA': 1, 'CHAPA': '052528', 'NOME': 'WEVERTON SILVA TAVARES', 'CPF': '07587117270', 'SECAO': 'LOJA 4 OPERACIONAL', 'FUNCAO': 'Auxiliar de Reposição', 'DATAADMISSAO': datetime.datetime(2025, 6, 6, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '004.001.002', 'CODFUNCAO': '000327', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 10330}
{'CODCOLIGADA': 2, 'CHAPA': '052335', 'NOME': 'WILLIAM MEDEIROS ROCHA', 'CPF': '37554018272', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Motorista Nivel I', 'DATAADMISSAO': datetime.datetime(2025, 1, 6, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000161', 'SALARIO': Decimal('2163.23'), 'CODSINDICATO': '02', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -669}
{'CODCOLIGADA': 2, 'CHAPA': '052624', 'NOME': 'WILLYS DE KASSIO SILVA DE SOUZA', 'CPF': '11649209282', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Auxiliar de Logistica', 'DATAADMISSAO': datetime.datetime(2026, 1, 5, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000061', 'SALARIO': Decimal('1621.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 2, 'CHAPA': '044167', 'NOME': 'WILSON SIDRIM DOS SANTOS NETO', 'CPF': '70700788204', 'SECAO': 'SEGURANCA PATRIMONIAL', 'FUNCAO': 'Fiscal de Loja', 'DATAADMISSAO': datetime.datetime(2021, 6, 14, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.003.010', 'CODFUNCAO': '000116', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -446}
{'CODCOLIGADA': 1, 'CHAPA': '052555', 'NOME': 'YAGO GUILHERME GUIMARAES BARROSO', 'CPF': '07036743239', 'SECAO': 'LOJA 8 OPERACIONAL', 'FUNCAO': 'Operador de Caixa', 'DATAADMISSAO': datetime.datetime(2025, 7, 16, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '008.001.002', 'CODFUNCAO': '000042', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 587}
{'CODCOLIGADA': 2, 'CHAPA': '051694', 'NOME': 'YAN DE SOUSA MEIRELES', 'CPF': '06342050210', 'SECAO': 'LOJA 9 OPERACIONAL', 'FUNCAO': 'Assistente de Estoque IV', 'DATAADMISSAO': datetime.datetime(2023, 8, 7, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.001.009', 'CODFUNCAO': '000282', 'SALARIO': Decimal('2043.00'), 'CODSINDICATO': '03', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 18156}
{'CODCOLIGADA': 3, 'CHAPA': '052467', 'NOME': 'YARLEY SERRA DA LUZ', 'CPF': '07596610226', 'SECAO': 'SEGURANCA PATRIMONIAL', 'FUNCAO': 'Fiscal de Loja', 'DATAADMISSAO': datetime.datetime(2025, 4, 4, 0, 0), 'CODSITUACAO': 'P', 'CODSECAO': '001.001.003', 'CODFUNCAO': '000116', 'SALARIO': Decimal('1680.00'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 122}
{'CODCOLIGADA': 1, 'CHAPA': '026120', 'NOME': 'YASMIN FREITAS ASSIS', 'CPF': '06930046221', 'SECAO': 'LOJA 7 OPERACIONAL', 'FUNCAO': 'Supervisor de E-commerce Nivel IV', 'DATAADMISSAO': datetime.datetime(2021, 9, 1, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '007.001.002', 'CODFUNCAO': '000423', 'SALARIO': Decimal('3296.62'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 2762}
{'CODCOLIGADA': 2, 'CHAPA': '052408', 'NOME': 'ZAQUEU CORREA SACRAMENTO', 'CPF': '91286980291', 'SECAO': 'LOGISTICA FROTA', 'FUNCAO': 'Motorista Nivel I', 'DATAADMISSAO': datetime.datetime(2025, 2, 3, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '001.004.001', 'CODFUNCAO': '000161', 'SALARIO': Decimal('2163.23'), 'CODSINDICATO': '02', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': 0}
{'CODCOLIGADA': 1, 'CHAPA': '052620', 'NOME': 'ZENILSON PERDIGAO DE OLIVEIRA', 'CPF': '10293506205', 'SECAO': 'LOJA 4 OPERACIONAL', 'FUNCAO': 'APRENDIZ', 'DATAADMISSAO': datetime.datetime(2025, 12, 17, 0, 0), 'CODSITUACAO': 'A', 'CODSECAO': '004.001.002', 'CODFUNCAO': '000038', 'SALARIO': Decimal('761.55'), 'CODSINDICATO': '01', 'INICIOPER': datetime.datetime(2025, 12, 21, 0, 0), 'FIMPER': datetime.datetime(2026, 1, 20, 0, 0), 'SALDO_MINUTOS': -720}

0
config/__init__.py Normal file
View File

16
config/asgi.py Normal file
View File

@ -0,0 +1,16 @@
"""
ASGI config for config project.
It exposes the ASGI callable as a module-level variable named ``application``.
For more information on this file, see
https://docs.djangoproject.com/en/4.2/howto/deployment/asgi/
"""
import os
from django.core.asgi import get_asgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings')
application = get_asgi_application()

View File

@ -0,0 +1,47 @@
# Middleware de diagnóstico: grava uma linha em NDJSON ao acessar /admin/
# Remover após confirmar correção do admin sem estilo.
import json
from pathlib import Path
from django.conf import settings
LOG_PATH = Path("/home/f3lipe/dev/.cursor/debug-288380.log")
SESSION_ID = "288380"
class DebugStaticLoggerMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
# #region agent log
if request.path.startswith("/admin/"):
static_root = getattr(settings, "STATIC_ROOT", None)
admin_css_exists = False
if static_root:
p = Path(static_root) / "admin" / "css"
admin_css_exists = p.exists() and any(p.iterdir())
try:
with open(LOG_PATH, "a") as f:
f.write(
json.dumps(
{
"sessionId": SESSION_ID,
"hypothesisId": "H1",
"location": "config/debug_static_logger.py",
"message": "admin request static config",
"data": {
"DEBUG": settings.DEBUG,
"STATIC_URL": getattr(settings, "STATIC_URL", None),
"STATIC_ROOT": str(static_root) if static_root else None,
"admin_css_exists": admin_css_exists,
},
"timestamp": __import__("time").time() * 1000,
},
ensure_ascii=False,
)
+ "\n"
)
except Exception:
pass
# #endregion
return self.get_response(request)

View File

129
config/settings/base.py Normal file
View File

@ -0,0 +1,129 @@
# SGMP_PROD/config/settings/base.py
import os
from pathlib import Path
from dotenv import load_dotenv
load_dotenv()
BASE_DIR = Path(__file__).resolve().parent.parent.parent
# Em produção defina a variável de ambiente SECRET_KEY; default apenas para desenvolvimento.
SECRET_KEY = os.getenv('SECRET_KEY', 'dev-insecure-key')
DEBUG = False
# Lista separada por vírgulas; em produção defina ALLOWED_HOSTS (ex.: "localhost,127.0.0.1,app.exemplo.com").
ALLOWED_HOSTS = [h.strip() for h in os.getenv('ALLOWED_HOSTS', '').split(',') if h.strip()]
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
# Apps de terceiros
'corsheaders',
# Seus apps
'solicitacoes'
]
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'whitenoise.middleware.WhiteNoiseMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'corsheaders.middleware.CorsMiddleware',
# 'winthor_sessions.middleware.WinthorBasicAuthMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
ROOT_URLCONF = 'config.urls'
WSGI_APPLICATION = 'config.wsgi.application'
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [BASE_DIR / 'templates'],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
'solicitacoes.context_processors.usuario_sistema',
],
},
},
]
# Banco de dados padrão (SQLite), será sobrescrito em produção e testes.
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
AUTH_PASSWORD_VALIDATORS = [
{'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator'},
{'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator'},
{'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator'},
{'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator'},
]
# Internacionalização
LANGUAGE_CODE = 'pt-br'
TIME_ZONE = 'America/Sao_Paulo'
USE_I18N = True
USE_TZ = True
# Arquivos Estáticos (CSS, JS, Imagens)
STATIC_URL = '/static/'
STATICFILES_DIRS = [d for d in [BASE_DIR / 'static'] if d.exists()]
STATIC_ROOT = BASE_DIR / 'staticfiles'
STATICFILES_STORAGE = 'whitenoise.storage.CompressedStaticFilesStorage'
# Arquivos de Mídia (Uploads de usuários)
MEDIA_URL = '/media/'
MEDIA_ROOT = BASE_DIR / 'mediafiles'
# Chave Primária Padrão
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
# ============================
# CONFIGURAÇÃO DE SESSÃO
# ============================
# 30 minutos (em segundos)
SESSION_COOKIE_AGE = 30 * 60
# SESSION_COOKIE_AGE = 1
# Expira por tempo, não só ao fechar browser
SESSION_EXPIRE_AT_BROWSER_CLOSE = True
SESSION_SAVE_EVERY_REQUEST = True
# Segurança básica do cookie
SESSION_COOKIE_HTTPONLY = True
SESSION_COOKIE_SAMESITE = "Lax"
SQLSERVER_CONFIG = {
"SERVER": os.getenv("RM_HOST"),
"PORT": int(os.getenv("RM_PORT", 38000)),
"USER": os.getenv("RM_USER"),
"PASSWORD": os.getenv("RM_PASS"),
"DATABASE": os.getenv("RM_DB"),
}
# ============================
# CONFIGURAÇÃO DE LOGIN/URLS
# ============================
LOGIN_URL = "/login/"
LOGIN_REDIRECT_URL = "/"
LOGOUT_REDIRECT_URL = "/login/"

39
config/settings/dev.py Normal file
View File

@ -0,0 +1,39 @@
# SGMP_PROD/config/settings/dev.py
from .base import *
# Sobrescreve o padrão seguro de 'base.py' para facilitar o desenvolvimento.
DEBUG = True
# Permite qualquer host durante o desenvolvimento.
ALLOWED_HOSTS = ["*"]
# Permite requisições de qualquer origem (útil para desenvolvimento de frontend separado).
# Requer que 'corsheaders' esteja em INSTALLED_APPS e MIDDLEWARE em base.py.
CORS_ALLOW_ALL_ORIGINS = True
# Nenhuma outra configuração é necessária, pois já herdamos o banco de dados
# SQLite e outras configurações do 'base.py', que são perfeitas para o desenvolvimento.
LOGGING = {
"version": 1,
"disable_existing_loggers": False,
"formatters": {
"verbose": {
"format": "[{asctime}] [{levelname}] {name}: {message}",
"style": "{",
},
},
"handlers": {
"console": {
"class": "logging.StreamHandler",
"formatter": "verbose",
},
},
"root": {
"handlers": ["console"],
"level": "INFO",
},
}

27
config/settings/prod.py Normal file
View File

@ -0,0 +1,27 @@
# aigents/settings/prod.py
from .base import *
import os
# DEBUG já é False por padrão no base.py, não precisamos redefinir.
# ALLOWED_HOSTS = ["localhost", "127.0.0.1"]
DATABASES = {
"default": {
"ENGINE": "django.db.backends.postgresql",
"HOST": os.getenv("DB_HOST"),
"PORT": os.getenv("DB_PORT", 5432),
"USER": os.getenv("DB_USER"),
"PASSWORD": os.getenv("DB_PASSWORD"),
"NAME": os.getenv("DB_NAME"),
}
}
# CSRF_TRUSTED_ORIGINS = ["https://aigents.f3lipe.com"]
SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True
# Sobrescreve os locais dos arquivos estáticos e de mídia para o servidor de produção.
# STATIC_ROOT = "/var/www/aigents/static/"
# MEDIA_ROOT = "/var/www/aigents/media/"

19
config/settings/test.py Normal file
View File

@ -0,0 +1,19 @@
# aigents/settings/test.py
from .base import *
# DEBUG já é False por padrão no base.py, o que é bom para testes.
# Adiciona apps necessários para testes
INSTALLED_APPS.append("connector")
INSTALLED_APPS.append("winthor_sessions")
# Sobrescreve o banco de dados para usar um banco de dados SQLite em memória.
# Isso torna os testes muito mais rápidos e garante que eles não toquem
# no banco de dados de desenvolvimento.
DATABASES = {
"default": {
"ENGINE": "django.db.backends.sqlite3",
"NAME": ":memory:",
}
}

14
config/urls.py Normal file
View File

@ -0,0 +1,14 @@
from django.contrib import admin
from django.urls import path, include
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
path("admin/", admin.site.urls),
path("", include("solicitacoes.urls")),
]
# Servir arquivos de mídia (anexos de pareceres etc.) pela própria aplicação.
# Em ambientes com servidor web dedicado (nginx/apache), essa configuração
# pode ser substituída pelo serviço de arquivos estáticos do servidor.
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

16
config/wsgi.py Normal file
View File

@ -0,0 +1,16 @@
"""
WSGI config for config project.
It exposes the WSGI callable as a module-level variable named ``application``.
For more information on this file, see
https://docs.djangoproject.com/en/4.2/howto/deployment/wsgi/
"""
import os
from django.core.wsgi import get_wsgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings.dev')
application = get_wsgi_application()

46
docker-compose.yaml Normal file
View File

@ -0,0 +1,46 @@
services:
web:
image: sgmp_prod:latest
container_name: sgmp_prod_web
build:
context: .
dockerfile: Dockerfile
# Ajuste na formatação do command para evitar quebras de linha indesejadas
command: gunicorn config.wsgi:application --bind 0.0.0.0:8888 --workers 3 --timeout 120
# Arquivo .env é opcional - se não existir, usa variáveis de ambiente do sistema
env_file:
- .env
ports:
- "8888:8888"
volumes:
- .:/app
- /app/venv
- mediafiles:/app/mediafiles
- staticfiles:/app/staticfiles
deploy:
resources:
limits:
cpus: "1.50"
memory: 1024M
reservations:
cpus: "0.50"
memory: 512M
restart: unless-stopped
networks:
- jurunense_net
volumes:
mediafiles:
staticfiles:
networks:
jurunense_net:
external: true

View File

@ -0,0 +1,82 @@
# Head em relação a quem? — Investigação
## Situação atual
- O perfil **Head** no SGMP aprova rascunhos enviados por **qualquer** gestor: no dashboard, usuários com perfil HEAD veem todas as solicitações em status `AGUARDANDO_HEAD`, sem filtro por “seus” gestores.
- Ou seja: **não existe hoje nenhuma regra que vincule um Head a um conjunto de gestores**. A pergunta “ele é Head em relação a quem?” ainda não está respondida no código.
## O que precisamos para filtrar
Para que um Head só aprove solicitações dos gestores que estão sob sua responsabilidade, é necessário ter em algum lugar a relação **Head ↔ Gestores**. Por exemplo:
- “Head (matrícula X) é superior dos gestores (matrículas A, B, C)”, ou
- “Gestor (matrícula A) tem gestor imediato Head (matrícula X)”.
No SGMP:
- **Solicitação** tem `solicitante` (FK para `UsuarioSistema`).
- **UsuarioSistema** (gestor ou head) tem `matricula` e `perfil`.
- Login é feito via **Winthor**; o `username` do Django é a **matrícula** vinda do Winthor, e o `UsuarioSistema` é identificado por essa `matricula`.
Ou seja: temos **matrícula do gestor** (solicitante) e **matrícula do Head** (usuário logado). Falta uma **fonte de verdade** que diga qual Head é responsável por qual gestor.
## Fontes possíveis: RM e Winthor
### 1. TOTVS RM (SQL Server)
- O RM tem conceitos de **hierarquia** e **gestor imediato**:
- **Chefia tradicional**: cadastro de chefes/supervisores (em algum campo ou tabela auxiliar).
- **Hierarquia por posição** (versões mais recentes): estrutura por posição/cargo.
- Em muitos clientes RM, a tabela **PFUNC** (ou tabelas relacionadas) expõe o “gestor imediato” do funcionário, por exemplo:
- Campo do tipo **CHAPAGERENTE** (ou **CHAPA_CHEFE**, **CODGERENTE**, etc.) na PFUNC, ou
- Tabela específica de chefia (ex.: PSUPERV, ou tabelas de “Hierarquia por Posição”).
- **Hoje no SGMP**: em `intf_sqlserver.py` a PFUNC é usada para listar colaboradores (CHAPA, NOME, CPF, CODSECAO, CODFUNCAO, etc.). **Nenhuma coluna de gestor imediato / chefia é utilizada**.
- **PessoaRM** no SGMP guarda `id_rm` (CODCOLIGADA-CHAPA) e `matricula` (CHAPA). Não há campo “gestor imediato” ou “chapa do head”.
**Conclusão RM:**
É **provável** que o RM já tenha condições de dizer “este funcionário (CHAPA) tem gestor imediato (CHAPA do chefe)”, mas isso **depende de**:
- (1) O cliente ter **preenchido** a chefia no RM (campo/tabela de gestor imediato ou hierarquia por posição).
- (2) Sabermos o **nome exato** da coluna/tabela (ex.: CHAPAGERENTE na PFUNC, ou tabela de hierarquia). Isso só pode ser confirmado no banco do RM (lista de colunas da PFUNC ou documentação do ambiente).
Se existir, por exemplo, `PFUNC.CHAPAGERENTE`:
- Dado o **gestor** (solicitante), precisamos obter a CHAPA dele no RM. O vínculo Gestor SGMP → RM pode ser: `UsuarioSistema.matricula` = CHAPA no RM (se a matrícula do Winthor for a mesma CHAPA), ou um mapeamento explícito (ex.: PessoaRM por matrícula/CPF).
- Com a CHAPA do gestor, consultamos no RM o **CHAPAGERENTE** (ou equivalente) desse registro. Esse valor seria a “CHAPA do Head” no RM.
- No SGMP, o Head logado tem `UsuarioSistema.matricula`. Se essa matrícula for a mesma que a CHAPA do gestor imediato no RM (ou houver mapeamento), podemos filtrar: “mostrar só solicitações cujo solicitante tem gestor imediato = usuário logado (Head)”.
### 2. Winthor (Oracle)
- No SGMP, **Winthor** é usado para:
- **Login**: `autenticar_usuario(login, senha)` consulta **PCEMPR** (MATRICULA, USUARIOBD, NOME, EMAIL, CPF, CODFILIAL, SITUACAO).
- **Dados do colaborador**: `buscar_colaborador_oracle(cpf)` também em PCEMPR (MATRICULA, NOME, CPF, SITUACAO, ENDERECO, etc.).
- No pipeline `pipeline_rm_winthor_ad.json` aparecem CODFILIAL, CODSETOR, SITUACAO; **não há campo de gestor / superior / hierarquia**.
- **Não foi encontrada** na documentação consultada referência a campo de “gestor imediato” ou “superior” na tabela PCEMPR do Winthor. Seria necessário:
- Consultar o dicionário de dados ou DBA do Oracle do Winthor no seu ambiente, ou
- Confirmar com a TOTVS/equipe de sistemas se existe tabela/campo de hierarquia no Winthor que possa ser usada para “Head de quem”.
**Conclusão Winthor:**
Com o que o SGMP usa hoje (PCEMPR para login e busca por CPF), **não há evidência de que já tenhamos condição de saber “Head em relação a quem” apenas pelo Winthor**. Pode existir em outro schema/tabela; isso exige verificação no ambiente.
## Resumo
| Fonte | Hoje no SGMP | Possível usar para “Head de quem”? |
|--------|--------------------------------------|-------------------------------------|
| **RM** | PFUNC sem campo de chefia | **Sim, se** existir e estiver preenchido um campo/tabela de gestor imediato (ex.: CHAPAGERENTE). Confirmar no banco do cliente. |
| **Winthor** | PCEMPR para login e dados básicos | **Inconclusivo.** Não há uso de hierarquia. Verificar se existe tabela/campo de superior no Oracle do Winthor. |
## Próximos passos recomendados
1. **No banco RM (SQL Server)**
- Listar as colunas da tabela **PFUNC** (ou consultar GCAMPOS onde TABELA = 'PFUNC') e procurar por colunas como CHAPAGERENTE, CHAPA_CHEFE, CODGERENTE, ou equivalente.
- Se existir: verificar se está preenchido para os gestores que devem ter Head; definir se a matrícula do Head no SGMP será a CHAPA do RM ou se será preciso mapear (ex.: por CPF ou por outro identificador).
2. **No Winthor (Oracle)**
- Verificar se **PCEMPR** ou outra tabela possui campo de “matrícula do superior” / “gestor imediato”.
- Se sim, definir como cruzar com UsuarioSistema (matrícula do Head) para filtrar solicitações.
3. **No SGMP**
- Manter por enquanto o comportamento atual (Head vê todas as solicitações AGUARDANDO_HEAD) até existir uma fonte confiável de “Head ↔ Gestores”.
- Quando houver essa fonte (RM e/ou Winthor):
- Implementar função (ex.: em `intf_sqlserver.py` ou `intf_winthor.py`) que, dado o Head (matrícula ou id), retorne a lista de matrículas dos gestores sob sua responsabilidade (ou que, dado o gestor, retorne a matrícula do Head).
- No `dashboard_view` (e onde mais listar solicitações para Head), filtrar: `Solicitacao.objects.filter(status=AGUARDANDO_HEAD, solicitante__matricula__in=matriculas_dos_gestores_do_head)` (ou equivalente).
Este arquivo pode ser usado como referência para a decisão e para a implementação futura do vínculo “Head em relação a quem”.

20
entrypoint.sh Normal file
View File

@ -0,0 +1,20 @@
#!/bin/bash
set -e
echo "=== Executando migrações do banco de dados ==="
python manage.py migrate --noinput || echo "Aviso: Migrações falharam ou não há mudanças"
echo "=== Coletando arquivos estáticos ==="
# Garante que o diretório existe
mkdir -p /app/staticfiles
python manage.py collectstatic --noinput --clear || {
echo "Aviso: collectstatic falhou, tentando novamente..."
python manage.py collectstatic --noinput || echo "Erro: Não foi possível coletar arquivos estáticos"
}
echo "=== Verificando arquivos estáticos coletados ==="
ls -la /app/staticfiles/ | head -10 || echo "Diretório staticfiles vazio ou não acessível"
echo "=== Iniciando servidor Gunicorn ==="
exec "$@"

25
manage.py Executable file
View File

@ -0,0 +1,25 @@
#!/usr/bin/env python
"""Django's command-line utility for administrative tasks."""
import os
import sys
from dotenv import load_dotenv
load_dotenv()
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings.dev')
def main():
"""Run administrative tasks."""
try:
from django.core.management import execute_from_command_line
except ImportError as exc:
raise ImportError(
"Couldn't import Django. Are you sure it's installed and "
"available on your PYTHONPATH environment variable? Did you "
"forget to activate a virtual environment?"
) from exc
execute_from_command_line(sys.argv)
if __name__ == '__main__':
main()

28
readme Normal file
View File

@ -0,0 +1,28 @@
# Link de referencias
- https://miro.com/app/board/uXjVL0plbIo=/ - Projeto no MIRO diagrama
# Objetivo principal:
Utilizar a plataforma integrada com sistemas do universo "Jurunense", importando dados como -cargos,-empregados,-setores,-filial/coligada e disponibilizar opções para gestão desses objetos.
Ex: Criar uma solicitação de DESLIGAMENTO
Criar uma solicitação de Movimentação de pessoa (Uma promoção, ou movimentação sem promocao)
'' '' de aumento de quadro.
'' '' Admissão por substituição
# Integrações externas
- RM (Totvs)
- Winthor (Totvs)
# Caso de uso sob cada tipo de solicitação.
* Solicitação de DESLIGAMENTO
- Ao escolher essa opção o usuário deve encontrar um formulário que renderize alguns campos (já preenchido ou não)
Chapa
Nome completo
Coligada / filial
Função
Matricula
Centro de Custo
Salário atual
Motivo do desligamento

11
requirements.txt Normal file
View File

@ -0,0 +1,11 @@
Django
whitenoise[brotli]>=6.0
django-extensions
django-environ==0.12.0
djangorestframework==3.16.1
pyodbc==5.1.0
oracledb==2.0.1
pymssql==2.2.7
python-dotenv
django-cors-headers
python-dateutil

0
solicitacoes/__init__.py Normal file
View File

225
solicitacoes/admin.py Normal file
View File

@ -0,0 +1,225 @@
from django.contrib import admin, messages
from django.urls import path
from django.shortcuts import redirect
from django.utils import timezone
from .models import HeadGestor, PessoaRM, UsuarioSistema
from .intf_sqlserver import listar_para_selecionar_colaborador
from .intf_winthor import buscar_colaborador_oracle
from .models import Solicitacao
@admin.register(PessoaRM)
class PessoaRMAdmin(admin.ModelAdmin):
list_display = (
"nome",
"matricula",
"cargo",
"setor",
"centro_custo",
"matricula_winthor",
"sincronizado_em",
)
search_fields = (
"nome",
"matricula",
"id_rm",
"matricula_winthor",
)
list_filter = (
"setor",
"cargo",
)
readonly_fields = (
"id_rm",
"sincronizado_em",
"criado_em",
"atualizado_em",
)
# Diz ao Django para usar um template customizado
change_list_template = "admin/solicitacoes/pessoarm/pessoarm_changelist.html"
def get_urls(self):
urls = super().get_urls()
custom_urls = [
path(
"sync-rm/",
self.admin_site.admin_view(self.sync_rm),
name="pessoarm-sync-rm",
),
]
return custom_urls + urls
def sync_rm(self, request):
dados_rm = listar_para_selecionar_colaborador()
criados = 0
atualizados = 0
winthor_ok = 0
winthor_erro = 0
winthor_sem_cpf = 0
agora = timezone.now()
for row in dados_rm:
id_rm = f"{row['CODCOLIGADA']}-{row['CHAPA']}"
matricula_winthor = None
# =========================
# Integração Winthor (CPF)
# =========================
cpf = row.get("CPF")
if cpf:
try:
dados_w = buscar_colaborador_oracle(cpf)
if dados_w and dados_w.get("matricula"):
matricula_winthor = dados_w["matricula"]
winthor_ok += 1
else:
winthor_erro += 1
except Exception:
winthor_erro += 1
else:
winthor_sem_cpf += 1
# =========================
# Sync RM (sempre executa)
# =========================
_, created = PessoaRM.objects.update_or_create(
id_rm=id_rm,
defaults={
"matricula": row["CHAPA"],
"nome": row["NOME"],
"cargo": row["FUNCAO"],
"setor": row["SECAO"],
"centro_custo": row["CODSECAO"],
"cpf": row["CPF"],
"data_admissao": row["DATAADMISSAO"],
"situacao": row["CODSITUACAO"],
"cod_funcao": row["CODFUNCAO"],
"salario": row["SALARIO"],
"cod_sindicato": row["CODSINDICATO"],
"saldo_banco_horas_minutos": row["SALDO_MINUTOS"],
"inicio_periodo_banco_horas": row["INICIOPER"],
"fim_periodo_banco_horas": row["FIMPER"],
"matricula_winthor": matricula_winthor,
"sincronizado_em": agora,
},
)
if created:
criados += 1
else:
atualizados += 1
# =========================
# Mensagens finais
# =========================
messages.success(
request,
(
"Sincronização RM concluída com sucesso. "
f"Criados: {criados} | Atualizados: {atualizados}"
),
)
if winthor_ok:
messages.info(
request,
f"Winthor: {winthor_ok} matrícula(s) sincronizada(s) com sucesso."
)
if winthor_sem_cpf:
messages.warning(
request,
f"Winthor: {winthor_sem_cpf} colaborador(es) sem CPF — ignorados."
)
if winthor_erro:
messages.warning(
request,
f"Winthor: {winthor_erro} falha(s) ao buscar matrícula."
)
return redirect("..")
@admin.register(UsuarioSistema)
class UsuarioSistemaAdmin(admin.ModelAdmin):
list_display = (
"nome",
"matricula",
"perfil",
"ativo",
"criado_em",
)
list_filter = (
"perfil",
"ativo",
)
search_fields = (
"nome",
"matricula",
)
readonly_fields = (
"criado_em",
"atualizado_em",
)
fieldsets = (
("Informações Básicas", {
"fields": ("matricula", "nome", "ativo")
}),
("Permissões", {
"fields": ("perfil",)
}),
("Auditoria", {
"fields": ("criado_em", "atualizado_em"),
"classes": ("collapse",)
}),
)
@admin.register(HeadGestor)
class HeadGestorAdmin(admin.ModelAdmin):
list_display = ("head", "gestor")
list_filter = ("head",)
search_fields = ("head__nome", "gestor__nome", "head__matricula", "gestor__matricula")
autocomplete_fields = ("head", "gestor")
@admin.register(Solicitacao)
class SolicitacaoAdmin(admin.ModelAdmin):
list_display = [
"id",
"tipo",
"status",
"funcionario",
"solicitante",
"criado_em",
]
list_filter = ("tipo", "status", "funcionario", "solicitante")
search_fields = ("id", "tipo", "status", "funcionario", "solicitante")
readonly_fields = ("id", "criado_em", "atualizado_em")
fieldsets = (
("Informações Básicas", {
"fields": ("id", "tipo", "status", "funcionario", "solicitante")
}),
("Auditoria", {
"fields": ("criado_em", "atualizado_em"),
"classes": ("collapse",)
}),
)

6
solicitacoes/apps.py Normal file
View File

@ -0,0 +1,6 @@
from django.apps import AppConfig
class SolicitacoesConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'solicitacoes'

View File

@ -0,0 +1,20 @@
# /SGMP_PROD/solicitacoes/context_processors.py
from .models import UsuarioSistema
def usuario_sistema(request):
"""
Context processor que adiciona o UsuarioSistema ao contexto de todos os templates.
"""
if request.user.is_authenticated:
try:
usuario = UsuarioSistema.objects.get(
matricula=request.user.username,
ativo=True
)
return {'usuario_sistema': usuario}
except UsuarioSistema.DoesNotExist:
return {'usuario_sistema': None}
return {'usuario_sistema': None}

View File

@ -0,0 +1,83 @@
# /SGMP_PROD/solicitacoes/decorators.py
from functools import wraps
from django.contrib import messages
from django.shortcuts import redirect
from .models import UsuarioSistema
def requer_perfil(*perfis_permitidos):
"""
Decorador que verifica se o usuário possui um dos perfis permitidos.
Uso:
@requer_perfil(UsuarioSistema.Perfil.GESTOR, UsuarioSistema.Perfil.GG)
def minha_view(request):
...
"""
def decorator(view_func):
@wraps(view_func)
def wrapper(request, *args, **kwargs):
if not request.user.is_authenticated:
messages.error(request, "Você precisa estar autenticado.")
return redirect("solicitacoes:login")
try:
usuario = UsuarioSistema.objects.get(
matricula=request.user.username,
ativo=True
)
except UsuarioSistema.DoesNotExist:
messages.error(request, "Usuário não encontrado no sistema.")
return redirect("solicitacoes:login")
# Aceita se o usuário possuir pelo menos um dos perfis permitidos,
# considerando perfil principal e perfis extras.
if not any(usuario.tem_perfil(p) for p in perfis_permitidos):
messages.error(
request,
f"Você não tem permissão para acessar esta funcionalidade. "
f"Perfil necessário: {', '.join([p.label for p in perfis_permitidos])}"
)
return redirect("solicitacoes:dashboard")
# Injeta o usuario no request para uso na view
request.usuario_sistema = usuario
return view_func(request, *args, **kwargs)
return wrapper
return decorator
def pode_criar_solicitacao(view_func):
"""
Decorador que verifica se o usuário pode criar solicitações.
Por padrão, apenas GESTOR pode criar.
"""
@wraps(view_func)
def wrapper(request, *args, **kwargs):
if not request.user.is_authenticated:
messages.error(request, "Você precisa estar autenticado.")
return redirect("solicitacoes:login")
try:
usuario = UsuarioSistema.objects.get(
matricula=request.user.username,
ativo=True
)
except UsuarioSistema.DoesNotExist:
messages.error(request, "Usuário não encontrado no sistema.")
return redirect("solicitacoes:login")
if usuario.perfil != UsuarioSistema.Perfil.GESTOR:
messages.error(
request,
"Apenas gestores podem criar solicitações."
)
return redirect("solicitacoes:dashboard")
request.usuario_sistema = usuario
return view_func(request, *args, **kwargs)
return wrapper

View File

@ -0,0 +1,613 @@
# /SGMP_PROD/solicitacoes/intf_sqlserver.py
import pymssql
from django.conf import settings
def get_sqlserver_connection():
"""
Cria uma conexão com o banco SQL Server do TOTVS RM.
A configuração é obtida a partir do settings do Django,
permitindo separação por ambiente (dev, homologação, produção).
"""
return pymssql.connect(
server=settings.SQLSERVER_CONFIG["SERVER"],
port=settings.SQLSERVER_CONFIG["PORT"],
user=settings.SQLSERVER_CONFIG["USER"],
password=settings.SQLSERVER_CONFIG["PASSWORD"],
database=settings.SQLSERVER_CONFIG["DATABASE"],
)
def listar_para_selecionar_colaborador(apenas_desligados=False):
"""
Lista colaboradores do RM para seleção.
Args:
apenas_desligados (bool): Se True, retorna apenas pessoas DESLIGADAS
(útil para admissão por substituição).
Se False, retorna pessoas que não estão desligadas (padrão).
Returns:
list: Lista de dicionários com dados dos colaboradores
"""
# Define o filtro de situação baseado no parâmetro
if apenas_desligados:
# Para admissão por substituição: busca pessoas DESLIGADAS
# CODSITUACAO = 'D' e DATADEMISSAO IS NOT NULL (seguindo padrão do sgmp)
filtro_situacao = "PF.CODSITUACAO = 'D' AND PF.DATADEMISSAO IS NOT NULL"
else:
# Padrão: busca pessoas que não estão desligadas (inclui admitidos)
filtro_situacao = "PF.CODSITUACAO <> 'D'"
query = f"""
WITH SALDO_ATUAL AS (
SELECT
SB.CODCOLIGADA,
SB.CHAPA,
SB.INICIOPER,
SB.FIMPER,
((SB.EXTRAANT - SB.ATRASOANT - SB.FALTAANT) +
(SB.EXTRAATU - SB.ATRASOATU - SB.FALTAATU)) AS SALDO_MINUTOS,
ROW_NUMBER() OVER (
PARTITION BY SB.CODCOLIGADA, SB.CHAPA
ORDER BY SB.FIMPER DESC
) AS RN
FROM ASALDOBANCOHOR SB
)
SELECT
PF.CODCOLIGADA,
PF.CHAPA,
PF.NOME,
P.CPF,
PS.DESCRICAO AS SECAO,
PU.NOME AS FUNCAO,
PF.DATAADMISSAO,
PF.DATADEMISSAO,
PF.CODSITUACAO,
PF.CODSECAO,
PF.CODFUNCAO,
PF.SALARIO,
PF.CODSINDICATO,
SA.INICIOPER,
SA.FIMPER,
SA.SALDO_MINUTOS
FROM PFUNC PF
JOIN PPESSOA P
ON P.CODIGO = PF.CODPESSOA
JOIN PSECAO PS
ON PS.CODCOLIGADA = PF.CODCOLIGADA
AND PS.CODIGO = PF.CODSECAO
JOIN PFUNCAO PU
ON PU.CODCOLIGADA = PF.CODCOLIGADA
AND PU.CODIGO = PF.CODFUNCAO
LEFT JOIN SALDO_ATUAL SA
ON SA.CODCOLIGADA = PF.CODCOLIGADA
AND SA.CHAPA = PF.CHAPA
AND SA.RN = 1
WHERE
{filtro_situacao}
ORDER BY PF.NOME
"""
with get_sqlserver_connection() as conn:
cursor = conn.cursor(as_dict=True)
cursor.execute(query)
return cursor.fetchall()
def buscar_colaboradores_rm_desligados(nome: str = None):
"""
Busca colaboradores DESLIGADOS no RM para fluxo de Substituição.
Seguindo padrão do sgmp:
- CODSITUACAO = 'D'
- DATADEMISSAO IS NOT NULL
Args:
nome (str, optional): Nome para filtrar (busca parcial, case-insensitive)
Returns:
list: Lista de dicionários com dados dos colaboradores desligados
"""
query = """
SELECT
PF.CODCOLIGADA,
PF.CHAPA,
P.NOME,
P.CPF,
PS.DESCRICAO AS SECAO,
PU.NOME AS FUNCAO,
PF.DATAADMISSAO,
PF.DATADEMISSAO,
PF.CODSITUACAO,
PF.CODSECAO,
PF.CODFUNCAO,
PF.SALARIO,
PF.CODSINDICATO
FROM PFUNC PF
JOIN PPESSOA P
ON P.CODIGO = PF.CODPESSOA
JOIN PSECAO PS
ON PS.CODCOLIGADA = PF.CODCOLIGADA
AND PS.CODIGO = PF.CODSECAO
JOIN PFUNCAO PU
ON PU.CODCOLIGADA = PF.CODCOLIGADA
AND PU.CODIGO = PF.CODFUNCAO
WHERE
PF.CODSITUACAO = 'D'
AND PF.DATADEMISSAO IS NOT NULL
"""
params = []
if nome:
query += " AND LOWER(P.NOME) LIKE LOWER(%s)"
params.append(f"%{nome}%")
query += " ORDER BY P.NOME"
with get_sqlserver_connection() as conn:
cursor = conn.cursor(as_dict=True)
cursor.execute(query, tuple(params) if params else None)
return cursor.fetchall()
def listar_cargos_ativos_rm():
"""
Lista cargos existentes no RM com base em uso real:
- Apenas cargos associados a colaboradores ATIVOS
- Remove duplicidade por nome
- Não depende de codcoligada do usuário
Retorna lista simples para uso em selects.
"""
query = """
SELECT DISTINCT
PU.CODIGO AS cod_funcao,
PU.NOME AS nome_funcao,
PU.CARGO AS cargo
FROM PFUNC PF
JOIN PFUNCAO PU
ON PU.CODCOLIGADA = PF.CODCOLIGADA
AND PU.CODIGO = PF.CODFUNCAO
WHERE
PF.CODSITUACAO <> 'D'
AND PU.INATIVA = 0
ORDER BY PU.NOME
"""
with get_sqlserver_connection() as conn:
cursor = conn.cursor(as_dict=True)
cursor.execute(query)
rows = cursor.fetchall()
# Normalização leve
cargos = []
vistos = set()
for row in rows:
nome = (row.get("nome_funcao") or "").strip()
if not nome:
continue
chave = nome.lower()
if chave in vistos:
continue
vistos.add(chave)
cargos.append({
"codigo": row.get("cod_funcao"),
"nome": nome,
"cargo": row.get("cargo"),
})
return cargos
def listar_secoes_ativas_rm():
"""
Lista seções/centros de custo existentes no RM com base em uso real:
- Apenas seções associadas a colaboradores ATIVOS
- Remove duplicidade por nome
- Não depende de codcoligada do usuário
Retorna lista simples para uso em selects.
"""
query = """
SELECT DISTINCT
PS.CODIGO AS cod_secao,
PS.DESCRICAO AS descricao_secao
FROM PFUNC PF
JOIN PSECAO PS
ON PS.CODCOLIGADA = PF.CODCOLIGADA
AND PS.CODIGO = PF.CODSECAO
WHERE
PF.CODSITUACAO <> 'D'
ORDER BY PS.DESCRICAO
"""
with get_sqlserver_connection() as conn:
cursor = conn.cursor(as_dict=True)
cursor.execute(query)
rows = cursor.fetchall()
# Normalização leve
secoes = []
vistos = set()
for row in rows:
descricao = (row.get("descricao_secao") or "").strip()
if not descricao:
continue
chave = descricao.lower()
if chave in vistos:
continue
vistos.add(chave)
secoes.append({
"codigo": row.get("cod_secao"),
"descricao": descricao,
})
return secoes
def listar_coligadas_rm():
"""
Lista coligadas existentes no RM para uso em selects (ex.: formulário de admissão por aumento).
Tenta GCOLIGADA (NOME); senão usa CODCOLIGADA distintos de PFUNC.
Retorna lista de {"codigo": int, "nome": str}. Exclui sempre CODCOLIGADA=0 (inválido no RM).
"""
try:
query = """
SELECT CODCOLIGADA AS codigo, NOME AS nome
FROM GCOLIGADA
WHERE CODCOLIGADA <> 0 AND NOME IS NOT NULL
ORDER BY NOME
"""
with get_sqlserver_connection() as conn:
cursor = conn.cursor(as_dict=True)
cursor.execute(query)
rows = cursor.fetchall()
result = [
{"codigo": row["codigo"], "nome": (row.get("nome") or str(row["codigo"])).strip()}
for row in rows
if row.get("codigo") and ((row.get("nome") or str(row["codigo"])).strip())
]
except Exception:
query = """
SELECT DISTINCT CODCOLIGADA AS codigo
FROM PFUNC
WHERE CODSITUACAO <> 'D' AND CODCOLIGADA <> 0
ORDER BY CODCOLIGADA
"""
with get_sqlserver_connection() as conn:
cursor = conn.cursor(as_dict=True)
cursor.execute(query)
rows = cursor.fetchall()
result = [{"codigo": row["codigo"], "nome": str(row["codigo"])} for row in rows if row.get("codigo")]
return [r for r in result if r.get("codigo") != 0]
def listar_filiais_rm():
"""
Lista filiais existentes no RM para uso em selects (ex.: formulário de admissão por aumento).
Tenta GFILIAL; senão usa CODCOLIGADA/CODFILIAL distintos de PFUNC quando existir CODFILIAL.
Retorna lista de {"cod_coligada": int, "codigo": int, "nome": str} para permitir filtrar por coligada no front.
"""
try:
query = """
SELECT CODCOLIGADA AS cod_coligada, CODFILIAL AS codigo,
COALESCE(NOME, CAST(CODFILIAL AS VARCHAR)) AS nome
FROM GFILIAL
ORDER BY CODCOLIGADA, CODFILIAL
"""
with get_sqlserver_connection() as conn:
cursor = conn.cursor(as_dict=True)
cursor.execute(query)
rows = cursor.fetchall()
out = [
{
"cod_coligada": int(row["cod_coligada"]),
"codigo": int(row["codigo"]),
"nome": (row.get("nome") or str(row["codigo"])).strip(),
}
for row in rows
]
return out
except Exception:
try:
query = """
SELECT DISTINCT CODCOLIGADA AS cod_coligada, CODFILIAL AS codigo
FROM PFUNC
WHERE CODSITUACAO <> 'D'
ORDER BY CODCOLIGADA, CODFILIAL
"""
with get_sqlserver_connection() as conn:
cursor = conn.cursor(as_dict=True)
cursor.execute(query)
rows = cursor.fetchall()
out = [
{"cod_coligada": int(row["cod_coligada"]), "codigo": int(row["codigo"]), "nome": str(int(row["codigo"]))}
for row in rows
]
return out
except Exception:
return []
def verificar_estabilidades_colaborador(id_rm: str):
"""
Verifica todas as estabilidades legais/operacionais de um colaborador
que podem bloquear um desligamento.
O id_rm deve estar no formato "CODCOLIGADA-CHAPA" (ex: "3-052412")
Retorna uma lista de dicionários com informações sobre cada estabilidade encontrada.
Args:
id_rm: Identificador do colaborador no formato "CODCOLIGADA-CHAPA"
Returns:
list: Lista de dicionários com:
- tipo: Tipo de estabilidade (MATERNIDADE, PREVIDENCIARIO, ACIDENTE_TRABALHO, CIPA)
- bloqueado: bool - Se o desligamento está bloqueado
- data_fim: date - Data até quando a estabilidade vale (None se indefinida)
- mensagem: str - Mensagem explicativa para o usuário
- detalhes: dict - Detalhes adicionais do afastamento
"""
# Extrai codcoligada e chapa do id_rm
try:
codcoligada_str, chapa = id_rm.split('-', 1)
codcoligada = int(codcoligada_str)
except (ValueError, AttributeError):
# Se não conseguir extrair, retorna lista vazia
return []
# Chama a função auxiliar
return verificar_estabilidades_colaborador_por_codcoligada_chapa(codcoligada, chapa)
def _normalizar_para_date(valor):
"""
Normaliza um valor para datetime.date.
Aceita date, datetime, ou outros tipos que tenham método .date()
Garante que sempre retorne date (não datetime).
"""
from datetime import date, datetime
if valor is None:
return None
# Se já é date (e não datetime), retorna direto
if isinstance(valor, date):
# Verifica se é datetime (datetime é subclasse de date)
if isinstance(valor, datetime):
return valor.date()
return valor
# Se é datetime, converte para date
if isinstance(valor, datetime):
return valor.date()
# Se tem método date(), tenta usar
if hasattr(valor, 'date'):
try:
resultado = valor.date()
# Se o resultado ainda for datetime, converte novamente
if isinstance(resultado, datetime):
return resultado.date()
return resultado
except (AttributeError, TypeError):
pass
# Se chegou aqui e não conseguiu converter, retorna None ou tenta converter de outra forma
return valor
def verificar_estabilidades_colaborador_por_codcoligada_chapa(codcoligada: int, chapa: str):
"""
Versão alternativa que aceita codcoligada e chapa diretamente.
Usada internamente pela função principal.
"""
from datetime import date, timedelta
try:
from dateutil.relativedelta import relativedelta
except ImportError:
# Fallback se dateutil não estiver instalado
def relativedelta(**kwargs):
months = kwargs.get('months', 0)
if months:
# Aproximação simples: 30 dias por mês
return timedelta(days=months * 30)
return timedelta()
estabilidades = []
query = """
SELECT
HS.TIPO,
HS.MOTIVO,
HS.DTINICIO,
HS.DTFINAL,
HS.OBSERVACAO,
HS.CODESTABILIDADE,
HS.AFASTPELAPREVIDENCIA
FROM PFHSTAFT HS
WHERE
HS.CODCOLIGADA = %s
AND HS.CHAPA = %s
AND (
-- Licença Maternidade
(HS.TIPO = 'E' AND HS.MOTIVO = '03')
OR
-- Afastamento Previdenciário
(HS.TIPO = 'P' AND HS.AFASTPELAPREVIDENCIA = 1)
OR
-- Acidente de Trabalho
(HS.TIPO = 'T')
OR
-- Outros tipos que podem indicar estabilidade
(HS.CODESTABILIDADE IS NOT NULL AND HS.CODESTABILIDADE <> '')
)
ORDER BY HS.DTINICIO DESC
"""
with get_sqlserver_connection() as conn:
cursor = conn.cursor(as_dict=True)
cursor.execute(query, (codcoligada, chapa))
rows = cursor.fetchall()
hoje = date.today() # Garantir que hoje é sempre date
for row in rows:
tipo_afast = row.get('TIPO', '').upper()
motivo = row.get('MOTIVO', '')
observacao = (row.get('OBSERVACAO') or '').upper()
dt_inicio = row.get('DTINICIO')
dt_final = row.get('DTFINAL')
afast_previdencia = row.get('AFASTPELAPREVIDENCIA', 0)
# 1. LICENÇA MATERNIDADE
if tipo_afast == 'E' and motivo == '03' and 'MATERNIDADE' in observacao:
if dt_final:
# Estabilidade: durante licença + 30 dias após retorno
data_retorno = _normalizar_para_date(dt_final)
data_fim_estabilidade = data_retorno + timedelta(days=30)
# Garante que data_fim_estabilidade seja date
data_fim_estabilidade = _normalizar_para_date(data_fim_estabilidade)
bloqueado = hoje <= data_fim_estabilidade
estabilidades.append({
'tipo': 'MATERNIDADE',
'bloqueado': bloqueado,
'data_fim': data_fim_estabilidade,
'mensagem': f"Colaboradora em estabilidade por licença maternidade. O desligamento não é permitido até {data_fim_estabilidade.strftime('%d/%m/%Y')}.",
'detalhes': {
'dt_inicio': dt_inicio,
'dt_final': dt_final,
'observacao': row.get('OBSERVACAO')
}
})
else:
# Licença em andamento sem data final
estabilidades.append({
'tipo': 'MATERNIDADE',
'bloqueado': True,
'data_fim': None,
'mensagem': "Colaboradora em licença maternidade. O desligamento não é permitido durante a licença e até 30 dias após o retorno.",
'detalhes': {
'dt_inicio': dt_inicio,
'dt_final': dt_final,
'observacao': row.get('OBSERVACAO')
}
})
# 2. AFASTAMENTO PREVIDENCIÁRIO
elif tipo_afast == 'P' and afast_previdencia == 1:
if dt_final:
data_fim = _normalizar_para_date(dt_final)
bloqueado = hoje <= data_fim
else:
# Afastamento em andamento
bloqueado = True
data_fim = None
if bloqueado:
estabilidades.append({
'tipo': 'PREVIDENCIARIO',
'bloqueado': True,
'data_fim': data_fim,
'mensagem': "Colaborador encontra-se afastado pelo INSS. O desligamento só poderá ser avaliado após o término do afastamento." + (f" (até {data_fim.strftime('%d/%m/%Y')})" if data_fim else ""),
'detalhes': {
'dt_inicio': dt_inicio,
'dt_final': dt_final,
'observacao': row.get('OBSERVACAO')
}
})
# 3. ACIDENTE DE TRABALHO
elif tipo_afast == 'T':
if dt_final:
# Estabilidade de 12 meses após retorno
data_retorno = _normalizar_para_date(dt_final)
if data_retorno is None or not isinstance(data_retorno, date):
continue # Não conseguiu normalizar, pula este registro
# Soma os meses usando relativedelta
# IMPORTANTE: relativedelta pode retornar datetime mesmo quando somado a date
data_fim_estabilidade = data_retorno + relativedelta(months=12)
# Garante que seja sempre date (não datetime)
# relativedelta pode retornar datetime, então normaliza novamente
from datetime import datetime as dt
if isinstance(data_fim_estabilidade, dt):
data_fim_estabilidade = data_fim_estabilidade.date()
elif not isinstance(data_fim_estabilidade, date):
data_fim_estabilidade = _normalizar_para_date(data_fim_estabilidade)
if data_fim_estabilidade is None or not isinstance(data_fim_estabilidade, date):
continue # Não conseguiu normalizar, pula
bloqueado = hoje <= data_fim_estabilidade
if bloqueado:
estabilidades.append({
'tipo': 'ACIDENTE_TRABALHO',
'bloqueado': True,
'data_fim': data_fim_estabilidade,
'mensagem': f"Colaborador possui estabilidade por acidente de trabalho até {data_fim_estabilidade.strftime('%d/%m/%Y')}.",
'detalhes': {
'dt_inicio': dt_inicio,
'dt_final': dt_final,
'dt_retorno': data_retorno,
'observacao': row.get('OBSERVACAO')
}
})
# 4. CIPA (verificar em tabela separada se existir)
query_cipa = """
SELECT TOP 1
DTINICIO,
DTFINAL
FROM VCANDIDATOSCIPA
WHERE
CODCOLIGADA = %s
AND CHAPA = %s
AND (DTFINAL IS NULL OR DTFINAL >= GETDATE())
ORDER BY DTINICIO DESC
"""
try:
with get_sqlserver_connection() as conn:
cursor = conn.cursor(as_dict=True)
cursor.execute(query_cipa, (codcoligada, chapa))
cipa_row = cursor.fetchone()
if cipa_row:
dt_fim_cipa = cipa_row.get('DTFINAL')
if dt_fim_cipa:
data_fim = _normalizar_para_date(dt_fim_cipa)
bloqueado = hoje <= data_fim
else:
# CIPA em andamento
bloqueado = True
data_fim = None
if bloqueado:
estabilidades.append({
'tipo': 'CIPA',
'bloqueado': True,
'data_fim': data_fim,
'mensagem': "Colaborador possui estabilidade por participação na CIPA. Desligamento não permitido neste período." + (f" (até {data_fim.strftime('%d/%m/%Y')})" if data_fim else ""),
'detalhes': {
'dt_inicio': cipa_row.get('DTINICIO'),
'dt_final': dt_fim_cipa
}
})
except Exception:
# Se a tabela CIPA não existir, ignora silenciosamente
pass
return estabilidades

View File

@ -0,0 +1,116 @@
# /SGMP_PROD/solicitacoes/intf_winthor.py
import os
import oracledb
# Tenta inicializar o Oracle Client usando a variável de ambiente ou caminho padrão
# No Docker, usa /opt/oracle/instantclient_21_13 (definido no Dockerfile)
# Em desenvolvimento local, pode usar /usr/lib/oracle/23/client64/lib
_oracle_client_initialized = False
def _init_oracle_client():
"""Inicializa o Oracle Client de forma lazy e segura."""
global _oracle_client_initialized
if _oracle_client_initialized:
return
oracle_lib_dir = os.getenv("ORACLE_LIB_DIR", "/opt/oracle/instantclient_21_13")
# Tenta inicializar com o caminho do Docker primeiro
try:
oracledb.init_oracle_client(lib_dir=oracle_lib_dir)
_oracle_client_initialized = True
return
except (oracledb.exceptions.DatabaseError, Exception):
pass
# Se falhar, tenta o caminho alternativo (desenvolvimento local)
if oracle_lib_dir != "/usr/lib/oracle/23/client64/lib":
try:
oracledb.init_oracle_client(lib_dir="/usr/lib/oracle/23/client64/lib")
_oracle_client_initialized = True
return
except (oracledb.exceptions.DatabaseError, Exception):
pass
# Se ambos falharem, marca como inicializado para não tentar novamente
# O erro será lançado quando tentar usar as funções
_oracle_client_initialized = True
def get_oracle_connection():
_init_oracle_client()
dsn = oracledb.makedsn(
host="10.1.1.241",
port=1521,
service_name="WINT"
)
return oracledb.connect(
user="SEVEN",
password="usr54sev",
dsn=dsn
)
def buscar_colaborador_oracle(cpf: str):
conn = get_oracle_connection()
cursor = conn.cursor()
query = """
SELECT
MATRICULA,
NOME,
CPF,
SITUACAO,
ADMISSAO,
DT_EXCLUSAO,
ENDERECO,
BAIRRO,
CIDADE,
ESTADO
FROM
PCEMPR
WHERE
CPF = :cpf
"""
cursor.execute(query, {"cpf": cpf})
row = cursor.fetchone()
colunas = [c[0].lower() for c in cursor.description] if row else []
cursor.close()
conn.close()
if not row:
return None
return dict(zip(colunas, row))
def autenticar_usuario(login: str, senha: str):
conn = get_oracle_connection()
cursor = conn.cursor()
query = """
SELECT
MATRICULA,
USUARIOBD,
NOME,
EMAIL,
CPF,
CODFILIAL,
SITUACAO
FROM PCEMPR
WHERE USUARIOBD = UPPER(:login)
AND SENHABD = CRYPT(UPPER(:senha), USUARIOBD)
AND SITUACAO = 'A'
"""
cursor.execute(query, {"login": login, "senha": senha})
row = cursor.fetchone()
colunas = [c[0].lower() for c in cursor.description] if row else []
cursor.close()
conn.close()
if not row:
return None # login ou senha inválidos
return dict(zip(colunas, row))

View File

@ -0,0 +1,156 @@
# Generated by Django 4.2.27 on 2026-02-01 22:32
from django.db import migrations, models
import django.db.models.deletion
import uuid
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='PessoaRM',
fields=[
('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
('criado_em', models.DateTimeField(auto_now_add=True)),
('atualizado_em', models.DateTimeField(auto_now=True)),
('id_rm', models.CharField(max_length=20, unique=True)),
('matricula', models.CharField(max_length=20, unique=True)),
('nome', models.CharField(max_length=255)),
('cargo', models.CharField(max_length=255)),
('setor', models.CharField(max_length=255)),
('centro_custo', models.CharField(max_length=50)),
('matricula_winthor', models.CharField(blank=True, db_index=True, help_text='Matrícula/código do usuário no Winthor', max_length=20, null=True)),
('sincronizado_em', models.DateTimeField(blank=True, null=True)),
],
options={
'verbose_name': 'Pessoa (RM)',
'verbose_name_plural': 'Pessoas (RM)',
},
),
migrations.CreateModel(
name='UsuarioSistema',
fields=[
('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
('criado_em', models.DateTimeField(auto_now_add=True)),
('atualizado_em', models.DateTimeField(auto_now=True)),
('matricula', models.CharField(max_length=20, unique=True)),
('nome', models.CharField(max_length=255)),
('ativo', models.BooleanField(default=True)),
('perfil', models.CharField(choices=[('GESTOR', 'Gestor'), ('GG', 'Gente e Gestão'), ('CONTROLADORIA', 'Controladoria'), ('DIRETORIA', 'Diretoria')], max_length=20)),
],
options={
'abstract': False,
},
),
migrations.CreateModel(
name='Solicitacao',
fields=[
('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
('criado_em', models.DateTimeField(auto_now_add=True)),
('atualizado_em', models.DateTimeField(auto_now=True)),
('tipo', models.CharField(choices=[('DESLIGAMENTO', 'Desligamento'), ('ADM_SUBSTITUICAO', 'Admissão por Substituição'), ('ADM_AUMENTO', 'Admissão por Aumento de Quadro'), ('MOVIMENTACAO', 'Movimentação')], max_length=30)),
('status', models.CharField(choices=[('RASCUNHO', 'Rascunho'), ('ENVIADA', 'Enviada'), ('APROVADA_GG', 'Aprovada GG'), ('APROVADA_CONTROLADORIA', 'Aprovada Controladoria'), ('APROVADA_DIRETORIA', 'Aprovada Diretoria'), ('FINALIZADA', 'Finalizada'), ('REPROVADA', 'Reprovada')], default='RASCUNHO', max_length=30)),
('enviada_em', models.DateTimeField(blank=True, null=True)),
('finalizada_em', models.DateTimeField(blank=True, null=True)),
('funcionario', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='solicitacoes', to='solicitacoes.pessoarm')),
('solicitante', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='solicitacoes_criadas', to='solicitacoes.usuariosistema')),
],
options={
'abstract': False,
},
),
migrations.CreateModel(
name='Movimentacao',
fields=[
('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
('criado_em', models.DateTimeField(auto_now_add=True)),
('atualizado_em', models.DateTimeField(auto_now=True)),
('altera_funcao', models.BooleanField(default=False)),
('altera_centro_custo', models.BooleanField(default=False)),
('novo_cod_secao', models.CharField(blank=True, max_length=50, null=True)),
('novo_cod_funcao', models.CharField(blank=True, max_length=50, null=True)),
('novo_salario', models.DecimalField(blank=True, decimal_places=2, max_digits=12, null=True)),
('data_efetivacao', models.DateField(help_text='Data que a mudança passa a valer no RM')),
('justificativa', models.TextField()),
('solicitacao', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='movimentacao', to='solicitacoes.solicitacao')),
],
options={
'abstract': False,
},
),
migrations.CreateModel(
name='Desligamento',
fields=[
('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
('criado_em', models.DateTimeField(auto_now_add=True)),
('atualizado_em', models.DateTimeField(auto_now=True)),
('motivo', models.TextField()),
('data_prevista_desligamento', models.DateField()),
('observacoes', models.TextField(blank=True)),
('solicitacao', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='desligamento', to='solicitacoes.solicitacao')),
],
options={
'abstract': False,
},
),
migrations.CreateModel(
name='AdmissaoSubstituicao',
fields=[
('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
('criado_em', models.DateTimeField(auto_now_add=True)),
('atualizado_em', models.DateTimeField(auto_now=True)),
('data_previsao_contratacao', models.DateField()),
('cod_coligada_destino', models.IntegerField(help_text='Cód. Coligada RM')),
('cod_filial_destino', models.IntegerField(help_text='Cód. Filial RM')),
('cod_secao_destino', models.CharField(help_text='Cód. Seção/Centro de Custo', max_length=50)),
('cod_funcao_destino', models.CharField(help_text='Cód. Função/Cargo', max_length=50)),
('justificativa', models.TextField()),
('solicitacao', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='admissao_substituicao', to='solicitacoes.solicitacao')),
],
options={
'abstract': False,
},
),
migrations.CreateModel(
name='AdmissaoAumentoQuadro',
fields=[
('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
('criado_em', models.DateTimeField(auto_now_add=True)),
('atualizado_em', models.DateTimeField(auto_now=True)),
('data_previsao_contratacao', models.DateField()),
('justificativa_estrategica', models.TextField()),
('cod_coligada_destino', models.IntegerField()),
('cod_filial_destino', models.IntegerField()),
('cod_secao_destino', models.CharField(max_length=50)),
('cod_funcao_destino', models.CharField(max_length=50)),
('requer_suplementacao_orcamentaria', models.BooleanField(default=False)),
('solicitacao', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='admissao_aumento', to='solicitacoes.solicitacao')),
],
options={
'abstract': False,
},
),
migrations.CreateModel(
name='Aprovacao',
fields=[
('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
('criado_em', models.DateTimeField(auto_now_add=True)),
('atualizado_em', models.DateTimeField(auto_now=True)),
('etapa', models.CharField(choices=[('GG', 'Gente e Gestão'), ('CONTROLADORIA', 'Controladoria'), ('DIRETORIA', 'Diretoria')], max_length=20)),
('decisao', models.CharField(choices=[('APROVADO', 'Aprovado'), ('REPROVADO', 'Reprovado')], max_length=10)),
('justificativa', models.TextField()),
('decidido_em', models.DateTimeField(auto_now_add=True)),
('solicitacao', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='aprovacoes', to='solicitacoes.solicitacao')),
('usuario', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='aprovacoes_realizadas', to='solicitacoes.usuariosistema')),
],
options={
'unique_together': {('solicitacao', 'etapa')},
},
),
]

View File

@ -0,0 +1,48 @@
# Generated by Django 4.2.27 on 2026-02-02 15:02
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('solicitacoes', '0001_initial'),
]
operations = [
migrations.AlterField(
model_name='pessoarm',
name='cargo',
field=models.CharField(help_text='Nome da função/cargo atual do colaborador', max_length=255),
),
migrations.AlterField(
model_name='pessoarm',
name='centro_custo',
field=models.CharField(help_text='Código da seção no RM (PFUNC.CODSECAO)', max_length=50),
),
migrations.AlterField(
model_name='pessoarm',
name='id_rm',
field=models.CharField(help_text='Identificador único do colaborador no RM (CODCOLIGADA + CHAPA)', max_length=20, unique=True),
),
migrations.AlterField(
model_name='pessoarm',
name='matricula',
field=models.CharField(help_text='Matrícula do colaborador no RM (PFUNC.CHAPA)', max_length=20, unique=True),
),
migrations.AlterField(
model_name='pessoarm',
name='matricula_winthor',
field=models.CharField(blank=True, db_index=True, help_text='Matrícula/código do usuário correspondente no Winthor', max_length=20, null=True),
),
migrations.AlterField(
model_name='pessoarm',
name='setor',
field=models.CharField(help_text='Descrição da seção/departamento atual', max_length=255),
),
migrations.AlterField(
model_name='pessoarm',
name='sincronizado_em',
field=models.DateTimeField(blank=True, help_text='Data/hora da última sincronização com o RM', null=True),
),
]

View File

@ -0,0 +1,58 @@
# Generated by Django 4.2.27 on 2026-02-02 15:09
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('solicitacoes', '0002_alter_pessoarm_cargo_alter_pessoarm_centro_custo_and_more'),
]
operations = [
migrations.AddField(
model_name='pessoarm',
name='cod_funcao',
field=models.CharField(blank=True, help_text='Código da função/cargo no RM (PFUNC.CODFUNCAO)', max_length=50, null=True),
),
migrations.AddField(
model_name='pessoarm',
name='cod_sindicato',
field=models.CharField(blank=True, help_text='Código do sindicato no RM', max_length=10, null=True),
),
migrations.AddField(
model_name='pessoarm',
name='cpf',
field=models.CharField(blank=True, help_text='CPF do colaborador (PPESSOA.CPF)', max_length=14, null=True),
),
migrations.AddField(
model_name='pessoarm',
name='data_admissao',
field=models.DateField(blank=True, help_text='Data de admissão do colaborador no RM', null=True),
),
migrations.AddField(
model_name='pessoarm',
name='fim_periodo_banco_horas',
field=models.DateField(blank=True, help_text='Fim do período do último banco de horas considerado', null=True),
),
migrations.AddField(
model_name='pessoarm',
name='inicio_periodo_banco_horas',
field=models.DateField(blank=True, help_text='Início do período do último banco de horas considerado', null=True),
),
migrations.AddField(
model_name='pessoarm',
name='salario',
field=models.DecimalField(blank=True, decimal_places=2, help_text='Salário atual do colaborador no RM', max_digits=12, null=True),
),
migrations.AddField(
model_name='pessoarm',
name='saldo_banco_horas_minutos',
field=models.IntegerField(blank=True, help_text='Saldo atual de banco de horas em minutos (se aplicável)', null=True),
),
migrations.AddField(
model_name='pessoarm',
name='situacao',
field=models.CharField(blank=True, help_text='Situação do colaborador no RM (PFUNC.CODSITUACAO)', max_length=5, null=True),
),
]

View File

@ -0,0 +1,43 @@
# Generated by Django 4.2.26 on 2026-02-06 22:01
from django.db import migrations, models
import django.db.models.deletion
import uuid
class Migration(migrations.Migration):
dependencies = [
('solicitacoes', '0003_pessoarm_cod_funcao_pessoarm_cod_sindicato_and_more'),
]
operations = [
migrations.AlterField(
model_name='solicitacao',
name='status',
field=models.CharField(choices=[('RASCUNHO', 'Rascunho'), ('ENVIADA', 'Enviada'), ('APROVADA_GG', 'Aprovada GG'), ('APROVADA_CONTROLADORIA', 'Aprovada Controladoria'), ('APROVADA_DIRETORIA', 'Aprovada Diretoria'), ('AGUARDANDO_DIRETORIA', 'Aguardando Diretoria'), ('FINALIZADA', 'Finalizada'), ('REPROVADA', 'Reprovada')], default='RASCUNHO', max_length=30),
),
migrations.AlterField(
model_name='usuariosistema',
name='perfil',
field=models.CharField(choices=[('GESTOR', 'Gestor'), ('GG', 'Gente e Gestão'), ('CONTROLADORIA', 'Controladoria'), ('DIRETORIA', 'Diretoria')], default='GESTOR', max_length=20),
),
migrations.CreateModel(
name='Parecer',
fields=[
('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
('atualizado_em', models.DateTimeField(auto_now=True)),
('etapa', models.CharField(choices=[('GG', 'Gente e Gestão'), ('CONTROLADORIA', 'Controladoria'), ('DIRETORIA', 'Diretoria')], help_text='Etapa do parecer (GG ou CONTROLADORIA)', max_length=20)),
('texto', models.TextField(help_text='Análise, dados e considerações sobre a solicitação')),
('anexo', models.FileField(blank=True, help_text='Anexo opcional ao parecer (documentos, planilhas, etc.)', null=True, upload_to='pareceres/anexos/%Y/%m/%d/')),
('criado_em', models.DateTimeField(auto_now_add=True)),
('solicitacao', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='pareceres', to='solicitacoes.solicitacao')),
('usuario', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='pareceres_emitidos', to='solicitacoes.usuariosistema')),
],
options={
'verbose_name': 'Parecer',
'verbose_name_plural': 'Pareceres',
'unique_together': {('solicitacao', 'etapa')},
},
),
]

View File

@ -0,0 +1,28 @@
# Generated by Django 4.2.26 on 2026-02-08 01:46
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('solicitacoes', '0004_alter_solicitacao_status_alter_usuariosistema_perfil_and_more'),
]
operations = [
migrations.AddField(
model_name='desligamento',
name='arquivo_pedido',
field=models.FileField(blank=True, help_text='Carta de pedido de demissão (obrigatório apenas para pedido de demissão)', null=True, upload_to='desligamentos/cartas/%Y/%m/%d/'),
),
migrations.AddField(
model_name='desligamento',
name='aviso_previo',
field=models.CharField(blank=True, choices=[('TRABALHADO', 'Trabalhado'), ('INDENIZADO', 'Indenizado (Dispensa imediata)'), ('DISPENSADO', 'Dispensado (Pedido de demissão)')], help_text='Tipo de aviso prévio (trabalhado, indenizado, dispensado)', max_length=20, null=True),
),
migrations.AddField(
model_name='desligamento',
name='tipo_desligamento',
field=models.CharField(blank=True, choices=[('PEDIDO_DEMISSAO', 'Pedido de Demissão'), ('SEM_JUSTA_CAUSA', 'Demissão sem Justa Causa'), ('COM_JUSTA_CAUSA', 'Demissão por Justa Causa'), ('TERMINO_CONTRATO', 'Término de Contrato de Experiência'), ('OUTROS', 'Outros')], help_text='Tipo de desligamento (pedido de demissão, sem justa causa, etc.)', max_length=30, null=True),
),
]

View File

@ -0,0 +1,74 @@
# Migration: add HEAD profile and AGUARDANDO_HEAD status (perfil Head aprova rascunho)
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("solicitacoes", "0005_adicionar_campos_desligamento"),
]
operations = [
migrations.AlterField(
model_name="solicitacao",
name="status",
field=models.CharField(
choices=[
("RASCUNHO", "Rascunho"),
("AGUARDANDO_HEAD", "Aguardando Head"),
("ENVIADA", "Enviada"),
("APROVADA_GG", "Aprovada GG"),
("APROVADA_CONTROLADORIA", "Aprovada Controladoria"),
("APROVADA_DIRETORIA", "Aprovada Diretoria"),
("AGUARDANDO_DIRETORIA", "Aguardando Diretoria"),
("FINALIZADA", "Finalizada"),
("REPROVADA", "Reprovada"),
],
default="RASCUNHO",
max_length=30,
),
),
migrations.AlterField(
model_name="usuariosistema",
name="perfil",
field=models.CharField(
choices=[
("GESTOR", "Gestor"),
("HEAD", "Head"),
("GG", "Gente e Gestão"),
("CONTROLADORIA", "Controladoria"),
("DIRETORIA", "Diretoria"),
],
default="GESTOR",
max_length=20,
),
),
migrations.AlterField(
model_name="aprovacao",
name="etapa",
field=models.CharField(
choices=[
("HEAD", "Head"),
("GG", "Gente e Gestão"),
("CONTROLADORIA", "Controladoria"),
("DIRETORIA", "Diretoria"),
],
max_length=20,
),
),
migrations.AlterField(
model_name="parecer",
name="etapa",
field=models.CharField(
choices=[
("HEAD", "Head"),
("GG", "Gente e Gestão"),
("CONTROLADORIA", "Controladoria"),
("DIRETORIA", "Diretoria"),
],
help_text="Etapa do parecer (GG ou CONTROLADORIA)",
max_length=20,
),
),
]

View File

@ -0,0 +1,48 @@
# Migration: HeadGestor - vínculo Head → Gestores (quem o Head aprova)
import uuid
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("solicitacoes", "0006_head_aguardando_head_choices"),
]
operations = [
migrations.CreateModel(
name="HeadGestor",
fields=[
("id", models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
("criado_em", models.DateTimeField(auto_now_add=True)),
("atualizado_em", models.DateTimeField(auto_now=True)),
(
"head",
models.ForeignKey(
on_delete=models.CASCADE,
related_name="gestores_vinculados",
to="solicitacoes.usuariosistema",
),
),
(
"gestor",
models.ForeignKey(
on_delete=models.CASCADE,
related_name="heads_que_me_aprovam",
to="solicitacoes.usuariosistema",
),
),
],
options={
"verbose_name": "Head → Gestor",
"verbose_name_plural": "Head → Gestores",
},
),
migrations.AddConstraint(
model_name="headgestor",
constraint=models.UniqueConstraint(
fields=("head", "gestor"), name="unique_head_gestor"
),
),
]

View File

@ -0,0 +1,54 @@
# Migration: UsuarioPerfilExtra - perfis adicionais por usuário (múltiplos perfis)
import uuid
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("solicitacoes", "0007_headgestor"),
]
operations = [
migrations.CreateModel(
name="UsuarioPerfilExtra",
fields=[
("id", models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
("criado_em", models.DateTimeField(auto_now_add=True)),
("atualizado_em", models.DateTimeField(auto_now=True)),
(
"usuario",
models.ForeignKey(
on_delete=models.CASCADE,
related_name="perfis_extras",
to="solicitacoes.usuariosistema",
),
),
(
"perfil",
models.CharField(
choices=[
("GESTOR", "Gestor"),
("HEAD", "Head"),
("GG", "Gente e Gestão"),
("CONTROLADORIA", "Controladoria"),
("DIRETORIA", "Diretoria"),
],
max_length=20,
),
),
],
options={
"verbose_name": "Perfil extra de usuário",
"verbose_name_plural": "Perfis extras de usuário",
},
),
migrations.AddConstraint(
model_name="usuarioperfilextra",
constraint=models.UniqueConstraint(
fields=("usuario", "perfil"),
name="unique_usuario_perfil_extra",
),
),
]

View File

761
solicitacoes/models.py Normal file
View File

@ -0,0 +1,761 @@
from django.db import models
from django.utils.translation import gettext_lazy as _
import uuid
class BaseModel(models.Model):
"""
Modelo base abstrato utilizado por todas as entidades do SGMP.
Centraliza atributos comuns de persistência, garantindo:
- Identificação única global via UUID (facilita integrações externas)
- Rastreabilidade temporal (criação e última atualização)
O uso de UUID como chave primária evita dependência de IDs sequenciais
e facilita sincronização entre sistemas distintos (SGMP, RM, Winthor).
"""
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
criado_em = models.DateTimeField(auto_now_add=True)
atualizado_em = models.DateTimeField(auto_now=True)
class Meta:
abstract = True
class TipoSolicitacao(models.TextChoices):
"""
Enumeração que define os tipos de solicitações suportadas pelo SGMP.
Cada tipo representa um processo de RH distinto, podendo possuir:
- regras de negócio específicas
- dados complementares próprios
- fluxos de validação e integração diferentes
Exemplos:
- Desligamento
- Admissão (substituição ou aumento de quadro)
- Movimentação interna
"""
DESLIGAMENTO = "DESLIGAMENTO", _("Desligamento")
ADMISSAO_SUBSTITUICAO = "ADM_SUBSTITUICAO", _("Admissão por Substituição")
ADMISSAO_AUMENTO = "ADM_AUMENTO", _("Admissão por Aumento de Quadro")
MOVIMENTACAO = "MOVIMENTACAO", _("Movimentação")
class StatusSolicitacao(models.TextChoices):
"""
Enumeração que representa o estado atual de uma solicitação
dentro do fluxo de aprovação do SGMP.
O status reflete a posição da solicitação no processo,
controlando permissões de edição, envio, aprovação e finalização.
O fluxo é progressivo e controlado, permitindo auditoria
e rastreabilidade do ciclo de vida da solicitação.
"""
RASCUNHO = "RASCUNHO", _("Rascunho")
AGUARDANDO_HEAD = "AGUARDANDO_HEAD", _("Aguardando Head")
ENVIADA = "ENVIADA", _("Enviada")
APROVADA_GG = "APROVADA_GG", _("Aprovada GG")
APROVADA_CONTROLADORIA = "APROVADA_CONTROLADORIA", _("Aprovada Controladoria")
APROVADA_DIRETORIA = "APROVADA_DIRETORIA", _("Aprovada Diretoria")
AGUARDANDO_DIRETORIA = "AGUARDANDO_DIRETORIA", _("Aguardando Diretoria")
FINALIZADA = "FINALIZADA", _("Finalizada")
REPROVADA = "REPROVADA", _("Reprovada")
class EtapaAprovacao(models.TextChoices):
"""
Enumeração que define as etapas formais de aprovação
dentro do fluxo decisório do SGMP.
Cada etapa corresponde a um papel organizacional específico,
responsável por validar a solicitação sob sua ótica
(pessoas, orçamento, estratégia).
"""
HEAD = "HEAD", _("Head")
GG = "GG", _("Gente e Gestão")
CONTROLADORIA = "CONTROLADORIA", _("Controladoria")
DIRETORIA = "DIRETORIA", _("Diretoria")
class DecisaoAprovacao(models.TextChoices):
"""
Enumeração que representa a decisão tomada em uma etapa
de aprovação de uma solicitação.
A decisão é registrada de forma explícita para garantir:
- clareza
- rastreabilidade
- auditoria do processo decisório
"""
APROVADO = "APROVADO", _("Aprovado")
REPROVADO = "REPROVADO", _("Reprovado")
class UsuarioSistema(BaseModel):
"""
Representa um usuário que possui acesso ao SGMP.
Este modelo não representa necessariamente um funcionário ativo,
mas sim um agente que interage com o sistema, como:
- gestores
- equipe de Gente & Gestão
- controladoria
- diretoria
O perfil do usuário define seu papel no fluxo de solicitações
e suas permissões de visualização, edição e aprovação.
"""
matricula = models.CharField(max_length=20, unique=True)
nome = models.CharField(max_length=255)
ativo = models.BooleanField(default=True)
class Perfil(models.TextChoices):
GESTOR = "GESTOR", _("Gestor")
HEAD = "HEAD", _("Head")
GG = "GG", _("Gente e Gestão")
CONTROLADORIA = "CONTROLADORIA", _("Controladoria")
DIRETORIA = "DIRETORIA", _("Diretoria")
perfil = models.CharField(
max_length=20,
choices=Perfil.choices,
default=Perfil.GESTOR
)
def tem_perfil(self, perfil: str) -> bool:
"""
Verifica se o usuário possui o perfil informado, considerando
o perfil principal e perfis extras.
"""
if self.perfil == perfil:
return True
# Evita import cíclico: FK de UsuarioPerfilExtra usa related_name="perfis_extras"
return self.perfis_extras.filter(perfil=perfil).exists()
def perfis_ativos(self):
"""
Retorna lista de códigos de perfis ativos para o usuário,
começando pelo perfil principal e incluindo extras (sem repetir).
"""
extras = list(self.perfis_extras.values_list("perfil", flat=True))
# Garante que o principal venha primeiro e não seja duplicado
return [self.perfil] + [p for p in extras if p != self.perfil]
def __str__(self):
return f"{self.nome} ({self.matricula})"
class UsuarioPerfilExtra(BaseModel):
"""
Representa perfis adicionais atribuídos a um usuário do sistema.
Exemplo: perfil principal GESTOR + perfil extra HEAD para permitir
atuar como Head sem perder o comportamento padrão de gestor.
"""
usuario = models.ForeignKey(
UsuarioSistema,
on_delete=models.CASCADE,
related_name="perfis_extras",
)
perfil = models.CharField(
max_length=20,
choices=UsuarioSistema.Perfil.choices,
)
class Meta:
constraints = [
models.UniqueConstraint(
fields=["usuario", "perfil"],
name="unique_usuario_perfil_extra",
),
]
verbose_name = "Perfil extra de usuário"
verbose_name_plural = "Perfis extras de usuário"
def __str__(self):
return f"{self.usuario} -> {self.perfil}"
class HeadGestor(BaseModel):
"""
Vínculo Head Gestores: define quais gestores um usuário com perfil HEAD
aprova. Quando o Head está cadastrado, o dashboard mostra apenas
solicitações AGUARDANDO_HEAD cujo solicitante está nesta lista.
"""
head = models.ForeignKey(
UsuarioSistema,
on_delete=models.CASCADE,
related_name="gestores_vinculados",
)
gestor = models.ForeignKey(
UsuarioSistema,
on_delete=models.CASCADE,
related_name="heads_que_me_aprovam",
)
class Meta:
constraints = [
models.UniqueConstraint(fields=["head", "gestor"], name="unique_head_gestor"),
]
verbose_name = "Head → Gestor"
verbose_name_plural = "Head → Gestores"
def __str__(self):
return f"{self.head} aprova {self.gestor}"
def matriculas_gestores_do_head(usuario: "UsuarioSistema") -> list:
"""
Retorna a lista de matrículas dos gestores que o usuário (HEAD) aprova.
Se o usuário não for HEAD ou não tiver gestores vinculados, retorna lista vazia.
"""
if not usuario or not usuario.tem_perfil(UsuarioSistema.Perfil.HEAD):
return []
return list(
HeadGestor.objects.filter(head=usuario).values_list("gestor__matricula", flat=True)
)
class PessoaRM(BaseModel):
"""
Representa um funcionário sincronizado a partir do TOTVS RM.
Este modelo armazena um *snapshot* dos dados cadastrais e organizacionais
do colaborador, utilizados pelo SGMP para iniciar e acompanhar processos
internos de RH (ex: desligamento, admissão, movimentação).
Importante:
- O TOTVS RM é a origem da verdade.
- Os dados aqui persistidos representam o estado do colaborador
no momento da sincronização.
- Alterações posteriores no RM NÃO atualizam este registro
automaticamente, exceto via rotina de sincronização.
-------------------------
Query de origem (consolidada)
-------------------------
A sincronização parte da tabela PFUNC (cadastro de pessoas),
utilizando LEFT JOIN para dados auxiliares, garantindo que
TODOS os colaboradores ativos sejam retornados, mesmo que
não possuam banco de horas.
WITH SALDO_ATUAL AS (
SELECT
SB.CODCOLIGADA,
SB.CHAPA,
SB.INICIOPER,
SB.FIMPER,
((SB.EXTRAANT - SB.ATRASOANT - SB.FALTAANT) +
(SB.EXTRAATU - SB.ATRASOATU - SB.FALTAATU)) AS SALDO_MINUTOS,
ROW_NUMBER() OVER (
PARTITION BY SB.CODCOLIGADA, SB.CHAPA
ORDER BY SB.FIMPER DESC
) AS RN
FROM ASALDOBANCOHOR SB
)
SELECT
PF.CODCOLIGADA,
PF.CHAPA,
PF.NOME,
P.CPF,
PS.DESCRICAO AS SECAO,
PU.NOME AS FUNCAO,
PF.DATAADMISSAO,
PF.CODSITUACAO,
PF.CODSECAO,
PF.CODFUNCAO,
PF.SALARIO,
PF.CODSINDICATO,
SA.INICIOPER,
SA.FIMPER,
SA.SALDO_MINUTOS
FROM PFUNC PF
JOIN PPESSOA P ON P.CODIGO = PF.CODPESSOA
JOIN PSECAO PS ON PS.CODCOLIGADA = PF.CODCOLIGADA AND PS.CODIGO = PF.CODSECAO
JOIN PFUNCAO PU ON PU.CODCOLIGADA = PF.CODCOLIGADA AND PU.CODIGO = PF.CODFUNCAO
LEFT JOIN SALDO_ATUAL SA
ON SA.CODCOLIGADA = PF.CODCOLIGADA
AND SA.CHAPA = PF.CHAPA
AND SA.RN = 1
WHERE PF.CODSITUACAO <> 'D';
-------------------------
Origem dos dados no RM
-------------------------
- PFUNC dados funcionais e vínculo
- PPESSOA dados pessoais básicos
- PSECAO estrutura organizacional
- PFUNCAO função/cargo
- ASALDOBANCOHOR banco de horas (dado auxiliar e opcional)
-------------------------
Observações de domínio
-------------------------
- Banco de horas NÃO é obrigatório para todos os colaboradores.
- Dados de banco de horas são usados apenas para validações
e apoio a decisões (ex: desligamento).
- O SGMP nunca utiliza ASALDOBANCOHOR como base de cadastro.
"""
# Identificação no RM
id_rm = models.CharField(
max_length=20,
unique=True,
help_text="Identificador único do colaborador no RM (CODCOLIGADA + CHAPA)"
)
matricula = models.CharField(
max_length=20,
unique=True,
help_text="Matrícula do colaborador no RM (PFUNC.CHAPA)"
)
# Dados cadastrais básicos
nome = models.CharField(max_length=255)
cargo = models.CharField(
max_length=255,
help_text="Nome da função/cargo atual do colaborador"
)
setor = models.CharField(
max_length=255,
help_text="Descrição da seção/departamento atual"
)
centro_custo = models.CharField(
max_length=50,
help_text="Código da seção no RM (PFUNC.CODSECAO)"
)
cpf = models.CharField(
max_length=14,
null=True,
blank=True,
help_text="CPF do colaborador (PPESSOA.CPF)"
)
data_admissao = models.DateField(
null=True,
blank=True,
help_text="Data de admissão do colaborador no RM"
)
situacao = models.CharField(
max_length=5,
null=True,
blank=True,
help_text="Situação do colaborador no RM (PFUNC.CODSITUACAO)"
)
cod_funcao = models.CharField(
max_length=50,
null=True,
blank=True,
help_text="Código da função/cargo no RM (PFUNC.CODFUNCAO)"
)
salario = models.DecimalField(
max_digits=12,
decimal_places=2,
null=True,
blank=True,
help_text="Salário atual do colaborador no RM"
)
cod_sindicato = models.CharField(
max_length=10,
null=True,
blank=True,
help_text="Código do sindicato no RM"
)
saldo_banco_horas_minutos = models.IntegerField(
null=True,
blank=True,
help_text="Saldo atual de banco de horas em minutos (se aplicável)"
)
inicio_periodo_banco_horas = models.DateField(
null=True,
blank=True,
help_text="Início do período do último banco de horas considerado"
)
fim_periodo_banco_horas = models.DateField(
null=True,
blank=True,
help_text="Fim do período do último banco de horas considerado"
)
# Integração externa (opcional)
matricula_winthor = models.CharField(
max_length=20,
null=True,
blank=True,
db_index=True,
help_text="Matrícula/código do usuário correspondente no Winthor"
)
# Controle de sincronização
sincronizado_em = models.DateTimeField(
null=True,
blank=True,
help_text="Data/hora da última sincronização com o RM"
)
class Meta:
verbose_name = "Pessoa (RM)"
verbose_name_plural = "Pessoas (RM)"
def __str__(self):
return f"{self.nome} ({self.matricula})"
#
class Solicitacao(BaseModel):
"""
Entidade central do SGMP e agregador raiz do processo de RH.
Uma Solicitação representa um pedido formal que percorre
um fluxo controlado de aprovação, desde sua criação até
a finalização ou reprovação.
Responsabilidades:
- Identificar o tipo de processo (ex: desligamento,movimentação, admissão por substuição ou por aumento de quadro)
- Relacionar solicitante e funcionário
- Controlar o status atual do fluxo
- Servir de ponto de ligação para aprovações e dados específicos
"""
tipo = models.CharField(
max_length=30,
choices=TipoSolicitacao.choices
)
solicitante = models.ForeignKey(
UsuarioSistema,
on_delete=models.PROTECT,
related_name="solicitacoes_criadas"
)
funcionario = models.ForeignKey(
PessoaRM,
on_delete=models.PROTECT,
null=True,
blank=True,
related_name="solicitacoes"
)
status = models.CharField(
max_length=30,
choices=StatusSolicitacao.choices,
default=StatusSolicitacao.RASCUNHO
)
enviada_em = models.DateTimeField(null=True, blank=True)
finalizada_em = models.DateTimeField(null=True, blank=True)
def pode_editar(self):
return self.status == StatusSolicitacao.RASCUNHO
def pode_enviar(self):
return self.status == StatusSolicitacao.RASCUNHO
def etapa_atual(self):
"""
Retorna a etapa atual baseada no status.
AGUARDANDO_HEAD: HEAD (apenas Head pode aprovar/reprovar)
ENVIADA: None (GG e CONTROLADORIA podem dar parecer)
AGUARDANDO_DIRETORIA: DIRETORIA (apenas Diretoria pode aprovar/reprovar)
"""
mapa = {
StatusSolicitacao.AGUARDANDO_HEAD: EtapaAprovacao.HEAD,
StatusSolicitacao.ENVIADA: None, # GG e CONTROLADORIA podem dar parecer
StatusSolicitacao.AGUARDANDO_DIRETORIA: EtapaAprovacao.DIRETORIA,
}
return mapa.get(self.status)
def pode_aprovar(self, usuario=None):
"""
Verifica se a solicitação pode ser aprovada.
- HEAD pode aprovar/reprovar quando status é AGUARDANDO_HEAD.
Considera tanto perfil principal quanto perfis extras.
- DIRETORIA pode aprovar/reprovar quando status é AGUARDANDO_DIRETORIA.
Considera tanto perfil principal quanto perfis extras.
"""
etapa_atual = self.etapa_atual()
if etapa_atual is None:
return False
if etapa_atual == EtapaAprovacao.HEAD:
if usuario and not usuario.tem_perfil(UsuarioSistema.Perfil.HEAD):
return False
return True
if etapa_atual == EtapaAprovacao.DIRETORIA:
if usuario and not usuario.tem_perfil(UsuarioSistema.Perfil.DIRETORIA):
return False
return True
return False
def pode_dar_parecer(self, usuario):
"""
Verifica se o usuário pode dar parecer na solicitação.
GG e CONTROLADORIA podem dar parecer quando status é ENVIADA.
"""
if self.status != StatusSolicitacao.ENVIADA:
return False
# GG e CONTROLADORIA podem dar parecer
if usuario.perfil not in [UsuarioSistema.Perfil.GG, UsuarioSistema.Perfil.CONTROLADORIA]:
return False
# Verifica se já deu parecer
etapa_esperada = None
if usuario.perfil == UsuarioSistema.Perfil.GG:
etapa_esperada = EtapaAprovacao.GG
elif usuario.perfil == UsuarioSistema.Perfil.CONTROLADORIA:
etapa_esperada = EtapaAprovacao.CONTROLADORIA
if etapa_esperada:
parecer_existente = self.pareceres.filter(etapa=etapa_esperada).exists()
if parecer_existente:
return False # Já deu parecer
return True
def __str__(self):
"""
Representação textual da solicitação.
Em alguns tipos (ex.: Admissão por aumento de quadro) não
funcionário vinculado, então protegemos contra None.
"""
tipo_label = self.get_tipo_display()
if self.funcionario:
return f"{tipo_label} - {self.funcionario.nome}"
return f"{tipo_label} - (sem funcionário)"
class TipoDesligamento(models.TextChoices):
"""Tipos de desligamento suportados pelo sistema."""
PEDIDO_DEMISSAO = "PEDIDO_DEMISSAO", _("Pedido de Demissão")
SEM_JUSTA_CAUSA = "SEM_JUSTA_CAUSA", _("Demissão sem Justa Causa")
COM_JUSTA_CAUSA = "COM_JUSTA_CAUSA", _("Demissão por Justa Causa")
TERMINO_CONTRATO = "TERMINO_CONTRATO", _("Término de Contrato de Experiência")
OUTROS = "OUTROS", _("Outros")
class TipoAvisoPrevio(models.TextChoices):
"""Tipos de aviso prévio."""
TRABALHADO = "TRABALHADO", _("Trabalhado")
INDENIZADO = "INDENIZADO", _("Indenizado (Dispensa imediata)")
DISPENSADO = "DISPENSADO", _("Dispensado (Pedido de demissão)")
class Desligamento(BaseModel):
"""
Modelo que representa os dados específicos de uma solicitação
de desligamento de funcionário.
Está vinculado obrigatoriamente a uma única Solicitação,
permitindo que o SGMP trate desligamentos como um subtipo
de processo, sem poluir o modelo genérico de Solicitação.
Contém apenas informações relevantes ao processo de desligamento,
mantendo a separação clara de responsabilidades no domínio.
"""
solicitacao = models.OneToOneField(
Solicitacao,
on_delete=models.CASCADE,
related_name="desligamento"
)
tipo_desligamento = models.CharField(
max_length=30,
choices=TipoDesligamento.choices,
help_text="Tipo de desligamento (pedido de demissão, sem justa causa, etc.)",
null=True,
blank=True
)
aviso_previo = models.CharField(
max_length=20,
choices=TipoAvisoPrevio.choices,
help_text="Tipo de aviso prévio (trabalhado, indenizado, dispensado)",
null=True,
blank=True
)
motivo = models.TextField()
data_prevista_desligamento = models.DateField()
observacoes = models.TextField(blank=True)
arquivo_pedido = models.FileField(
upload_to='desligamentos/cartas/%Y/%m/%d/',
null=True,
blank=True,
help_text="Carta de pedido de demissão (obrigatório apenas para pedido de demissão)"
)
def __str__(self):
return f"Desligamento - {self.solicitacao.funcionario.nome}"
class AdmissaoSubstituicao(BaseModel):
"""
Representa a contratação de um novo colaborador para ocupar a vaga
de alguém que saiu (desligamento) ou mudou de área (movimentação).
Ponto de Atenção: O 'substituído' é a PessoaRM vinculada na Solicitacao pai.
"""
solicitacao = models.OneToOneField(
Solicitacao,
on_delete=models.CASCADE,
related_name="admissao_substituicao"
)
data_previsao_contratacao = models.DateField()
# Dados do Destino (Onde o novo colaborador irá trabalhar)
cod_coligada_destino = models.IntegerField(help_text="Cód. Coligada RM")
cod_filial_destino = models.IntegerField(help_text="Cód. Filial RM")
cod_secao_destino = models.CharField(max_length=50, help_text="Cód. Seção/Centro de Custo")
cod_funcao_destino = models.CharField(max_length=50, help_text="Cód. Função/Cargo")
justificativa = models.TextField()
def __str__(self):
return f"Substituição de {self.solicitacao.funcionario.nome}"
class AdmissaoAumentoQuadro(BaseModel):
"""
Representa a abertura de uma nova vaga no orçamento (Headcount),
sem um colaborador predecessor.
"""
solicitacao = models.OneToOneField(
Solicitacao,
on_delete=models.CASCADE,
related_name="admissao_aumento"
)
data_previsao_contratacao = models.DateField()
justificativa_estrategica = models.TextField()
# Estrutura de Destino
cod_coligada_destino = models.IntegerField()
cod_filial_destino = models.IntegerField()
cod_secao_destino = models.CharField(max_length=50)
cod_funcao_destino = models.CharField(max_length=50)
# No BPMN menciona 'Avaliar Suplementação' - campo para controle orçamentário
requer_suplementacao_orcamentaria = models.BooleanField(default=False)
def __str__(self):
return f"Aumento de Quadro - {self.cod_secao_destino}"
class Movimentacao(BaseModel):
"""
Representa alteração de cargo, setor ou centro de custo de um
colaborador ativo.
"""
solicitacao = models.OneToOneField(
Solicitacao,
on_delete=models.CASCADE,
related_name="movimentacao"
)
# Flags de Mudança (conforme decisão no BPMN: "Altera Função?", "Transfere CC?")
altera_funcao = models.BooleanField(default=False)
altera_centro_custo = models.BooleanField(default=False)
# Novos Dados (Snapshot do Destino)
novo_cod_secao = models.CharField(max_length=50, null=True, blank=True)
novo_cod_funcao = models.CharField(max_length=50, null=True, blank=True)
novo_salario = models.DecimalField(max_digits=12, decimal_places=2, null=True, blank=True)
data_efetivacao = models.DateField(help_text="Data que a mudança passa a valer no RM")
justificativa = models.TextField()
def __str__(self):
return f"Movimentação - {self.solicitacao.funcionario.nome}"
class Aprovacao(BaseModel):
"""
Representa uma decisão formal tomada em uma etapa específica
do fluxo de aprovação de uma solicitação.
Cada aprovação registra:
- a etapa do processo
- a decisão tomada
- o usuário responsável
- a justificativa
- o momento da decisão
O modelo garante que exista apenas uma aprovação
por etapa para cada solicitação, assegurando consistência
e integridade do processo decisório.
"""
solicitacao = models.ForeignKey(
Solicitacao,
on_delete=models.CASCADE,
related_name="aprovacoes"
)
etapa = models.CharField(
max_length=20,
choices=EtapaAprovacao.choices
)
decisao = models.CharField(
max_length=10,
choices=DecisaoAprovacao.choices
)
usuario = models.ForeignKey(
UsuarioSistema,
on_delete=models.PROTECT,
related_name="aprovacoes_realizadas"
)
justificativa = models.TextField()
decidido_em = models.DateTimeField(auto_now_add=True)
class Meta:
unique_together = ("solicitacao", "etapa")
def __str__(self):
return f"{self.solicitacao.id} - {self.etapa} - {self.decisao}"
class Parecer(BaseModel):
"""
Representa um parecer técnico emitido por GG ou CONTROLADORIA
sobre uma solicitação. Diferente de Aprovacao, um Parecer não
altera o status da solicitação diretamente, apenas fornece análise e dados.
Quando ambos os pareceres (GG e CONTROLADORIA) são dados,
a solicitação muda para AGUARDANDO_DIRETORIA.
"""
solicitacao = models.ForeignKey(
Solicitacao,
on_delete=models.CASCADE,
related_name="pareceres"
)
etapa = models.CharField(
max_length=20,
choices=EtapaAprovacao.choices,
help_text="Etapa do parecer (GG ou CONTROLADORIA)"
)
usuario = models.ForeignKey(
UsuarioSistema,
on_delete=models.PROTECT,
related_name="pareceres_emitidos"
)
texto = models.TextField(
help_text="Análise, dados e considerações sobre a solicitação"
)
anexo = models.FileField(
upload_to='pareceres/anexos/%Y/%m/%d/',
null=True,
blank=True,
help_text="Anexo opcional ao parecer (documentos, planilhas, etc.)"
)
criado_em = models.DateTimeField(auto_now_add=True)
class Meta:
unique_together = ("solicitacao", "etapa")
verbose_name = "Parecer"
verbose_name_plural = "Pareceres"
def __str__(self):
return f"Parecer {self.etapa} - {self.solicitacao.id}"

494
solicitacoes/services.py Normal file
View File

@ -0,0 +1,494 @@
# /SGMP_PROD/solicitacoes/services.py
import logging
from datetime import date
from typing import Dict, Any, Tuple
from django.db import transaction
from django.utils import timezone
from .models import (
PessoaRM,
Solicitacao,
Desligamento,
AdmissaoSubstituicao,
AdmissaoAumentoQuadro,
Movimentacao,
Aprovacao,
Parecer,
UsuarioSistema,
TipoSolicitacao,
StatusSolicitacao,
DecisaoAprovacao,
EtapaAprovacao,
)
from .intf_sqlserver import listar_para_selecionar_colaborador, verificar_estabilidades_colaborador
from .intf_winthor import buscar_colaborador_oracle
# Configuração do Logger para rastreabilidade
logger = logging.getLogger(__name__)
STATUS_POR_ETAPA = {
EtapaAprovacao.HEAD: StatusSolicitacao.ENVIADA,
EtapaAprovacao.DIRETORIA: StatusSolicitacao.FINALIZADA,
}
# --- Exceções de Domínio ---
# Usar exceções customizadas torna o código mais explícito e fácil de
# tratar nas camadas superiores (views, APIs).
class SolicitacaoError(Exception):
"""Classe base para erros relacionados a solicitações."""
pass
class ValidacaoError(SolicitacaoError):
"""Lançada quando uma regra de negócio é violada."""
pass
class PermissaoError(SolicitacaoError):
"""Lançada quando um usuário tenta executar uma ação não permitida."""
pass
def sincronizar_colaboradores_rm() -> Tuple[int, int]:
"""
Executa a sincronização de colaboradores do TOTVS RM para o SGMP.
Esta função é responsável por:
1. Buscar todos os colaboradores ativos no RM.
2. Usar 'update_or_create' para inserir novos ou atualizar existentes.
3. Tentar, de forma resiliente, enriquecer o dado com a matrícula do Winthor.
A lógica de integração fica isolada aqui, protegendo o resto do sistema
de sua complexidade.
Retorna:
Uma tupla (criados, atualizados) com a contagem de registros.
"""
logger.info("Iniciando sincronização de colaboradores com o TOTVS RM.")
dados_rm = listar_para_selecionar_colaborador()
criados = 0
atualizados = 0
agora = timezone.now()
for row in dados_rm:
id_rm = f"{row['CODCOLIGADA']}-{row['CHAPA']}"
cpf = row.get('CPF')
matricula_winthor = None
# --- Tratamento de Integração Satélite (Winthor) ---
# A busca no Winthor é "best-effort". Uma falha aqui não deve
# impedir a sincronização principal com o RM.
if cpf:
try:
dados_winthor = buscar_colaborador_oracle(cpf)
if dados_winthor:
matricula_winthor = dados_winthor.get('matricula')
except Exception as e:
logger.error(f"Falha ao buscar CPF {cpf} no Winthor: {e}")
# O 'update_or_create' é atômico por padrão e a forma mais segura
# e eficiente de realizar a sincronização.
_, created = PessoaRM.objects.update_or_create(
id_rm=id_rm,
defaults={
"matricula": row["CHAPA"],
"nome": row["NOME"],
"cpf": cpf,
"cargo": row["FUNCAO"],
"setor": row["SECAO"],
"centro_custo": row["CODSECAO"],
"data_admissao": row["DATAADMISSAO"],
"situacao": row["CODSITUACAO"],
"cod_funcao": row["CODFUNCAO"],
"salario": row["SALARIO"],
"cod_sindicato": row["CODSINDICATO"],
"saldo_banco_horas_minutos": row.get("SALDO_MINUTOS"),
"inicio_periodo_banco_horas": row.get("INICIOPER"),
"fim_periodo_banco_horas": row.get("FIMPER"),
"matricula_winthor": matricula_winthor,
"sincronizado_em": agora,
},
)
if created:
criados += 1
else:
atualizados += 1
logger.info(f"Sincronização concluída. Criados: {criados}, Atualizados: {atualizados}.")
return criados, atualizados
# --- Service de Gestão de Solicitações (Core do Domínio) ---
@transaction.atomic
def criar_solicitacao_desligamento(
solicitante: UsuarioSistema,
funcionario: PessoaRM,
tipo_desligamento: str,
aviso_previo: str,
motivo: str,
data_prevista_desligamento: date,
observacoes: str = "",
arquivo_pedido = None
) -> Solicitacao:
"""
Cria uma solicitação de Desligamento de forma transacional.
Validações:
- Garante que não existe outra solicitação em aberto para o mesmo funcionário.
- Verifica estabilidades legais/operacionais que podem bloquear o desligamento.
O decorador @transaction.atomic garante que a criação da Solicitação
e do Desligamento ocorram juntas. Se uma falhar, a outra é revertida.
"""
if Solicitacao.objects.filter(
funcionario=funcionario,
status__in=[
StatusSolicitacao.RASCUNHO,
StatusSolicitacao.ENVIADA,
StatusSolicitacao.APROVADA_GG,
StatusSolicitacao.APROVADA_CONTROLADORIA,
StatusSolicitacao.APROVADA_DIRETORIA
]
).exists():
raise ValidacaoError("Já existe uma solicitação em andamento para este funcionário.")
# Verifica estabilidades que bloqueiam o desligamento
estabilidades = verificar_estabilidades_colaborador(funcionario.id_rm)
estabilidades_bloqueantes = [e for e in estabilidades if e.get('bloqueado', False)]
if estabilidades_bloqueantes:
mensagens = [e['mensagem'] for e in estabilidades_bloqueantes]
raise ValidacaoError(
"Desligamento bloqueado por estabilidade legal/operacional:\n" +
"\n".join(f"{msg}" for msg in mensagens)
)
solicitacao = Solicitacao.objects.create(
tipo=TipoSolicitacao.DESLIGAMENTO,
solicitante=solicitante,
funcionario=funcionario,
status=StatusSolicitacao.RASCUNHO
)
Desligamento.objects.create(
solicitacao=solicitacao,
tipo_desligamento=tipo_desligamento,
aviso_previo=aviso_previo,
motivo=motivo,
data_prevista_desligamento=data_prevista_desligamento,
observacoes=observacoes,
arquivo_pedido=arquivo_pedido
)
logger.info(f"Solicitação de Desligamento {solicitacao.id} criada para {funcionario.nome} por {solicitante.nome}.")
return solicitacao
@transaction.atomic
def criar_solicitacao_aumento_quadro(
solicitante: UsuarioSistema,
dados_admissao: Dict[str, Any]
) -> Solicitacao:
"""
Cria uma solicitação de Admissão por Aumento de Quadro.
Este tipo de solicitação não possui um 'funcionario' vinculado
inicialmente, pois representa a criação de uma nova vaga.
"""
solicitacao = Solicitacao.objects.create(
tipo=TipoSolicitacao.ADMISSAO_AUMENTO,
solicitante=solicitante,
# 'funcionario' é None por definição aqui
funcionario=None,
status=StatusSolicitacao.RASCUNHO
)
AdmissaoAumentoQuadro.objects.create(
solicitacao=solicitacao,
**dados_admissao
)
logger.info(f"Solicitação de Aumento de Quadro {solicitacao.id} criada por {solicitante.nome}.")
return solicitacao
@transaction.atomic
def criar_solicitacao_substituicao(
solicitante: UsuarioSistema,
funcionario_substituido: PessoaRM,
dados_admissao: Dict[str, Any],
) -> Solicitacao:
"""
Cria uma solicitação de Admissão por Substituição.
Regras:
- Deve existir um funcionário sendo substituído
- Não pode haver outra solicitação ativa para esse funcionário
- Permite funcionários desligados, pois a substituição é exatamente para substituir quem saiu
"""
# Não valida situação desligada para substituição, pois é esperado que o funcionário
# substituído possa estar desligado (essa é a razão da substituição)
if Solicitacao.objects.filter(
funcionario=funcionario_substituido,
status__in=[
StatusSolicitacao.RASCUNHO,
StatusSolicitacao.ENVIADA,
StatusSolicitacao.APROVADA_GG,
StatusSolicitacao.APROVADA_CONTROLADORIA,
StatusSolicitacao.APROVADA_DIRETORIA,
],
).exists():
raise ValidacaoError("Já existe uma solicitação em andamento para este funcionário.")
solicitacao = Solicitacao.objects.create(
tipo=TipoSolicitacao.ADMISSAO_SUBSTITUICAO,
solicitante=solicitante,
funcionario=funcionario_substituido,
status=StatusSolicitacao.RASCUNHO,
)
AdmissaoSubstituicao.objects.create(
solicitacao=solicitacao,
**dados_admissao,
)
logger.info(
f"Solicitação de Substituição {solicitacao.id} criada para "
f"{funcionario_substituido.nome} por {solicitante.nome}."
)
return solicitacao
@transaction.atomic
def criar_solicitacao_movimentacao(
solicitante: UsuarioSistema,
funcionario: PessoaRM,
dados_movimentacao: Dict[str, Any],
) -> Solicitacao:
"""
Cria uma solicitação de Movimentação Interna.
Regras:
- Funcionário deve estar ativo
- Não pode haver outra solicitação ativa para o mesmo funcionário
"""
if funcionario.situacao == 'D':
raise ValidacaoError("Não é possível movimentar um funcionário desligado.")
if Solicitacao.objects.filter(
funcionario=funcionario,
status__in=[
StatusSolicitacao.RASCUNHO,
StatusSolicitacao.ENVIADA,
StatusSolicitacao.APROVADA_GG,
StatusSolicitacao.APROVADA_CONTROLADORIA,
StatusSolicitacao.APROVADA_DIRETORIA,
],
).exists():
raise ValidacaoError("Já existe uma solicitação em andamento para este funcionário.")
solicitacao = Solicitacao.objects.create(
tipo=TipoSolicitacao.MOVIMENTACAO,
solicitante=solicitante,
funcionario=funcionario,
status=StatusSolicitacao.RASCUNHO,
)
Movimentacao.objects.create(
solicitacao=solicitacao,
**dados_movimentacao,
)
logger.info(
f"Solicitação de Movimentação {solicitacao.id} criada para "
f"{funcionario.nome} por {solicitante.nome}."
)
return solicitacao
@transaction.atomic
def enviar_solicitacao(solicitacao: Solicitacao, usuario: UsuarioSistema) -> Solicitacao:
"""
Muda o status de uma solicitação de 'Rascunho' para 'Aguardando Head'.
O Head deve aprovar ou reprovar; após aprovação do Head a solicitação
passa para ENVIADA (e enviada_em é preenchido). Reprovação do Head REPROVADA.
Validações:
- Apenas o solicitante pode enviar.
- A solicitação deve estar no estado 'Rascunho'.
"""
if solicitacao.solicitante != usuario:
raise PermissaoError("Apenas o solicitante pode enviar a solicitação.")
if not solicitacao.pode_enviar():
raise ValidacaoError(f"A solicitação não pode ser enviada no status atual ({solicitacao.get_status_display()}).")
solicitacao.status = StatusSolicitacao.AGUARDANDO_HEAD
solicitacao.save()
# enviada_em será preenchido quando o Head aprovar (em aprovar_reprovar_por_head)
logger.info(f"Solicitação {solicitacao.id} enviada para aprovação do Head por {usuario.nome}.")
return solicitacao
@transaction.atomic
def registrar_parecer(
solicitacao: Solicitacao,
usuario: UsuarioSistema,
texto: str,
anexo=None
) -> Parecer:
"""
Registra um parecer de GG ou CONTROLADORIA sobre uma solicitação.
Não altera o status da solicitação diretamente.
Quando ambos os pareceres (GG e CONTROLADORIA) são dados,
a solicitação muda automaticamente para AGUARDANDO_DIRETORIA.
Validações:
- Verifica se o usuário pode dar parecer (GG ou CONTROLADORIA)
- Verifica se a solicitação está no status ENVIADA
- Impede pareceres duplicados para a mesma etapa
"""
if not solicitacao.pode_dar_parecer(usuario):
raise PermissaoError("Usuário não pode dar parecer nesta solicitação.")
# Mapeia perfil para etapa
mapa_perfil_etapa = {
UsuarioSistema.Perfil.GG: EtapaAprovacao.GG,
UsuarioSistema.Perfil.CONTROLADORIA: EtapaAprovacao.CONTROLADORIA,
}
etapa = mapa_perfil_etapa.get(usuario.perfil)
if not etapa:
raise PermissaoError("Apenas GG e Controladoria podem dar parecer.")
# Verifica se já existe parecer para esta etapa
if Parecer.objects.filter(solicitacao=solicitacao, etapa=etapa).exists():
raise ValidacaoError(f"Já existe um parecer da {etapa.label} para esta solicitação.")
# Cria o parecer
parecer = Parecer.objects.create(
solicitacao=solicitacao,
etapa=etapa,
usuario=usuario,
texto=texto,
anexo=anexo
)
# Verifica se ambos os pareceres foram dados
parecer_gg = Parecer.objects.filter(solicitacao=solicitacao, etapa=EtapaAprovacao.GG).exists()
parecer_controladoria = Parecer.objects.filter(solicitacao=solicitacao, etapa=EtapaAprovacao.CONTROLADORIA).exists()
if parecer_gg and parecer_controladoria:
# Ambos os pareceres foram dados, muda status para AGUARDANDO_DIRETORIA
solicitacao.status = StatusSolicitacao.AGUARDANDO_DIRETORIA
solicitacao.save()
logger.info(f"Solicitação {solicitacao.id} mudou para AGUARDANDO_DIRETORIA após ambos os pareceres serem dados.")
logger.info(f"Parecer da {etapa.label} registrado para a solicitação {solicitacao.id} por {usuario.nome}.")
return parecer
@transaction.atomic
def aprovar_reprovar_solicitacao(
solicitacao: Solicitacao,
aprovador: UsuarioSistema,
decisao: str,
justificativa: str = ""
) -> Solicitacao:
"""
Registra uma decisão (Aprovação/Reprovação) da DIRETORIA.
Apenas a DIRETORIA pode aprovar/reprovar solicitações.
A solicitação deve estar no status AGUARDANDO_DIRETORIA.
Validações:
- Verifica se o aprovador é da DIRETORIA
- Verifica se a solicitação está aguardando aprovação da Diretoria
- Justificativa é obrigatória apenas para reprovação
"""
if aprovador.perfil != UsuarioSistema.Perfil.DIRETORIA:
raise PermissaoError("Apenas a Diretoria pode aprovar/reprovar solicitações.")
if solicitacao.status != StatusSolicitacao.AGUARDANDO_DIRETORIA:
raise ValidacaoError("A solicitação não está aguardando aprovação da Diretoria.")
etapa_atual = solicitacao.etapa_atual()
if etapa_atual != EtapaAprovacao.DIRETORIA:
raise ValidacaoError("A solicitação não está em uma etapa de aprovação válida.")
# Valida justificativa apenas para reprovação
if decisao == DecisaoAprovacao.REPROVADO and not justificativa.strip():
raise ValidacaoError("Justificativa é obrigatória para reprovação.")
# Cria o registro de decisão
Aprovacao.objects.create(
solicitacao=solicitacao,
etapa=etapa_atual,
decisao=decisao,
usuario=aprovador,
justificativa=justificativa or "Aprovado" # Valor padrão para aprovação
)
if decisao == DecisaoAprovacao.REPROVADO:
solicitacao.status = StatusSolicitacao.REPROVADA
solicitacao.finalizada_em = timezone.now()
else:
solicitacao.status = STATUS_POR_ETAPA[etapa_atual]
if solicitacao.status == StatusSolicitacao.FINALIZADA:
solicitacao.finalizada_em = timezone.now()
solicitacao.save()
logger.info(f"Decisão '{decisao}' registrada pela Diretoria para a solicitação {solicitacao.id} por {aprovador.nome}.")
return solicitacao
@transaction.atomic
def aprovar_reprovar_por_head(
solicitacao: Solicitacao,
aprovador: UsuarioSistema,
decisao: str,
justificativa: str = "",
) -> Solicitacao:
"""
Registra a decisão (Aprovação/Reprovação) do HEAD sobre o rascunho enviado pelo gestor.
Apenas o perfil HEAD pode usar esta função.
A solicitação deve estar no status AGUARDANDO_HEAD.
Se aprovado: status ENVIADA e enviada_em é preenchido.
Se reprovado: status REPROVADA e finalizada_em é preenchido.
"""
if aprovador.perfil != UsuarioSistema.Perfil.HEAD:
raise PermissaoError("Apenas o Head pode aprovar/reprovar solicitações nesta etapa.")
if solicitacao.status != StatusSolicitacao.AGUARDANDO_HEAD:
raise ValidacaoError("A solicitação não está aguardando aprovação do Head.")
etapa_atual = solicitacao.etapa_atual()
if etapa_atual != EtapaAprovacao.HEAD:
raise ValidacaoError("A solicitação não está em etapa de aprovação do Head.")
if decisao == DecisaoAprovacao.REPROVADO and not justificativa.strip():
raise ValidacaoError("Justificativa é obrigatória para reprovação.")
Aprovacao.objects.create(
solicitacao=solicitacao,
etapa=EtapaAprovacao.HEAD,
decisao=decisao,
usuario=aprovador,
justificativa=justificativa or "Aprovado",
)
if decisao == DecisaoAprovacao.REPROVADO:
solicitacao.status = StatusSolicitacao.REPROVADA
solicitacao.finalizada_em = timezone.now()
else:
solicitacao.status = StatusSolicitacao.ENVIADA
solicitacao.enviada_em = timezone.now()
solicitacao.save()
logger.info(
f"Decisão '{decisao}' registrada pelo Head para a solicitação {solicitacao.id} por {aprovador.nome}."
)
return solicitacao

View File

@ -0,0 +1,2 @@
# Template tags do app solicitacoes

View File

@ -0,0 +1,34 @@
# /SGMP_PROD/solicitacoes/templatetags/solicitacoes_extras.py
from django import template
register = template.Library()
@register.filter
def minutos_para_horas(minutos):
"""Converte minutos para horas com 1 casa decimal"""
if minutos is None:
return None
try:
horas = float(minutos) / 60.0
return f"{horas:.1f}"
except (ValueError, TypeError):
return None
@register.filter
def formatar_saldo_banco_horas(minutos):
"""Formata saldo de banco de horas de forma legível"""
if minutos is None:
return "N/A"
try:
minutos_int = int(minutos)
horas = minutos_int / 60.0
if minutos_int >= 0:
return f"{minutos_int} minutos ({horas:.1f} horas)"
else:
return f"{minutos_int} minutos"
except (ValueError, TypeError):
return "N/A"

View File

View File

@ -0,0 +1,311 @@
# /SGMP_PROD/solicitacoes/tests/test_desligamento_services.py
import json
from datetime import date, timedelta
from unittest import TestCase as AssertionsMixin
from pathlib import Path
from django.test import TestCase
from django.db import IntegrityError
from ..models import (
PessoaRM,
UsuarioSistema,
Solicitacao,
Desligamento,
Aprovacao,
StatusSolicitacao,
DecisaoAprovacao,
EtapaAprovacao
)
from .. import services
# --- Estrutura para Geração do Relatório JSON ---
# Esta estrutura será populada durante a execução dos testes
TEST_RESULTS = {
"summary": {
"total": 0,
"passed": 0,
"failed": 0,
"errors": 0,
},
"details": [],
}
class TestResultLogger(AssertionsMixin):
"""
Um mixin para registrar os resultados de cada teste em nossa estrutura JSON.
"""
def run(self, result=None):
self.test_result_data = {
"name": self.id(),
"status": "PASS",
"description": self._testMethodDoc or "Sem descrição.",
"steps": [],
"error_message": None,
}
# Armazena a referência original do 'addFailure'
original_addFailure = result.addFailure
# Monkey-patch para capturar a falha
def custom_addFailure(test, err):
self.test_result_data["status"] = "FAIL"
self.test_result_data["error_message"] = str(err[1])
original_addFailure(test, err)
result.addFailure = custom_addFailure
super().run(result)
# Restaura o método original para não afetar outros testes
result.addFailure = original_addFailure
TEST_RESULTS["details"].append(self.test_result_data)
TEST_RESULTS["summary"]["total"] += 1
if self.test_result_data["status"] == "PASS":
TEST_RESULTS["summary"]["passed"] += 1
else:
TEST_RESULTS["summary"]["failed"] += 1
def _add_step(self, description, success=True):
self.test_result_data["steps"].append({
"description": description,
"success": success
})
class DesligamentoServiceTests(TestResultLogger, TestCase):
"""
Testa o ciclo de vida completo de uma Solicitação de Desligamento,
incluindo criação, validações, permissões e o fluxo de aprovação.
"""
@classmethod
def tearDownClass(cls):
"""
Executado uma vez no final de todos os testes desta classe.
Gera o arquivo JSON com os resultados.
"""
output_path = Path("./test_results.json")
with open(output_path, "w", encoding="utf-8") as f:
json.dump(TEST_RESULTS, f, indent=4, ensure_ascii=False)
print(f"\n[INFO] Relatório de testes salvo em: {output_path.resolve()}")
super().tearDownClass()
def setUp(self):
"""
Prepara o ambiente para cada teste, criando os usuários e
o funcionário que serão usados nos cenários.
"""
# 1. Criação dos Atores do Processo
self.solicitante = UsuarioSistema.objects.create(
matricula="100", nome="Gestor Solicitante", perfil=UsuarioSistema.Perfil.GESTOR
)
self.aprovador_head = UsuarioSistema.objects.create(
matricula="150", nome="Aprovador Head", perfil=UsuarioSistema.Perfil.HEAD
)
self.aprovador_gg = UsuarioSistema.objects.create(
matricula="200", nome="Aprovador de GG", perfil=UsuarioSistema.Perfil.GG
)
self.aprovador_controladoria = UsuarioSistema.objects.create(
matricula="300", nome="Aprovador da Controladoria", perfil=UsuarioSistema.Perfil.CONTROLADORIA
)
self.aprovador_diretoria = UsuarioSistema.objects.create(
matricula="400", nome="Aprovador da Diretoria", perfil=UsuarioSistema.Perfil.DIRETORIA
)
# 2. Criação do Objeto do Processo
self.funcionario = PessoaRM.objects.create(
id_rm="1-12345", matricula="12345", nome="Colaborador Teste", situacao='A'
)
# --- Testes de Caminho Feliz (Happy Path) ---
def test_criar_desligamento_sucesso(self):
"""
Garante que uma solicitação de desligamento é criada corretamente
com o status inicial 'RASCUNHO'.
"""
solicitacao = services.criar_solicitacao_desligamento(
solicitante=self.solicitante,
funcionario=self.funcionario,
motivo="Teste de criação",
data_prevista_desligamento=date.today(),
)
self._add_step("Service 'criar_solicitacao_desligamento' executado.")
self.assertIsNotNone(solicitacao)
self.assertEqual(Solicitacao.objects.count(), 1)
self.assertEqual(Desligamento.objects.count(), 1)
self._add_step("Objetos Solicitacao e Desligamento criados no DB.")
self.assertEqual(solicitacao.status, StatusSolicitacao.RASCUNHO)
self.assertEqual(solicitacao.tipo, "DESLIGAMENTO")
self.assertEqual(solicitacao.desligamento.motivo, "Teste de criação")
self._add_step("Validação dos atributos e status inicial da solicitação.")
def test_fluxo_aprovacao_completo_sucesso(self):
"""
Simula o fluxo completo de aprovação de um desligamento,
passando por todas as etapas até a finalização.
"""
# Etapa 1: Criação e Envio (gestor envia → AGUARDANDO_HEAD)
solicitacao = services.criar_solicitacao_desligamento(
solicitante=self.solicitante, funcionario=self.funcionario,
motivo="Fluxo completo", data_prevista_desligamento=date.today()
)
services.enviar_solicitacao(solicitacao, usuario=self.solicitante)
solicitacao.refresh_from_db()
self.assertEqual(solicitacao.status, StatusSolicitacao.AGUARDANDO_HEAD)
self.assertIsNone(solicitacao.enviada_em)
self._add_step("Solicitação criada e enviada (status: AGUARDANDO_HEAD).")
# Etapa 1b: Aprovação Head (libera para ENVIADA)
services.aprovar_reprovar_por_head(
solicitacao, self.aprovador_head, DecisaoAprovacao.APROVADO, "OK Head"
)
solicitacao.refresh_from_db()
self.assertEqual(solicitacao.status, StatusSolicitacao.ENVIADA)
self.assertIsNotNone(solicitacao.enviada_em)
self._add_step("Aprovação pelo Head (status: ENVIADA).")
# Etapa 2: Aprovação GG
services.aprovar_reprovar_solicitacao(
solicitacao, self.aprovador_gg, DecisaoAprovacao.APROVADO, "OK GG"
)
solicitacao.refresh_from_db()
self.assertEqual(solicitacao.status, StatusSolicitacao.APROVADA_GG)
self.assertTrue(Aprovacao.objects.filter(solicitacao=solicitacao, etapa=EtapaAprovacao.GG).exists())
self._add_step("Aprovação por Gente & Gestão (status: APROVADA_GG).")
# Etapa 3: Aprovação Controladoria
services.aprovar_reprovar_solicitacao(
solicitacao, self.aprovador_controladoria, DecisaoAprovacao.APROVADO, "OK Controladoria"
)
solicitacao.refresh_from_db()
self.assertEqual(solicitacao.status, StatusSolicitacao.APROVADA_CONTROLADORIA)
self._add_step("Aprovação pela Controladoria (status: APROVADA_CONTROLADORIA).")
# Etapa 4: Aprovação Diretoria (Finalização)
services.aprovar_reprovar_solicitacao(
solicitacao, self.aprovador_diretoria, DecisaoAprovacao.APROVADO, "OK Diretoria"
)
solicitacao.refresh_from_db()
self.assertEqual(solicitacao.status, StatusSolicitacao.FINALIZADA)
self.assertIsNotNone(solicitacao.finalizada_em)
self._add_step("Aprovação pela Diretoria, finalizando a solicitação (status: FINALIZADA).")
def test_fluxo_reprovacao_sucesso(self):
"""
Garante que a reprovação em qualquer etapa move a solicitação
para o status 'REPROVADA' e a finaliza.
"""
solicitacao = services.criar_solicitacao_desligamento(
solicitante=self.solicitante, funcionario=self.funcionario,
motivo="Teste de reprovação", data_prevista_desligamento=date.today()
)
services.enviar_solicitacao(solicitacao, usuario=self.solicitante)
self._add_step("Solicitação criada e enviada (AGUARDANDO_HEAD).")
# Reprovação na primeira etapa (Head)
services.aprovar_reprovar_por_head(
solicitacao, self.aprovador_head, DecisaoAprovacao.REPROVADO, "Reprovado pelo Head"
)
solicitacao.refresh_from_db()
self._add_step("Service de reprovação executado pelo Head.")
self.assertEqual(solicitacao.status, StatusSolicitacao.REPROVADA)
self.assertIsNotNone(solicitacao.finalizada_em)
self.assertTrue(Aprovacao.objects.filter(solicitacao=solicitacao, decisao=DecisaoAprovacao.REPROVADO).exists())
self._add_step("Status da solicitação e data de finalização validados como REPROVADA.")
# --- Testes de Validação e Permissão (Caminho Infeliz) ---
def test_criar_solicitacao_duplicada_falha(self):
"""
Verifica se o service levanta ValidacaoError ao tentar criar uma
solicitação para um funcionário que possui uma em andamento.
"""
# Cria a primeira solicitação (válida)
services.criar_solicitacao_desligamento(
solicitante=self.solicitante, funcionario=self.funcionario,
motivo="Primeira solicitação", data_prevista_desligamento=date.today()
)
self._add_step("Primeira solicitação criada com sucesso.")
# Tenta criar a segunda (inválida)
with self.assertRaises(services.ValidacaoError) as ctx:
services.criar_solicitacao_desligamento(
solicitante=self.solicitante, funcionario=self.funcionario,
motivo="Segunda solicitação (inválida)", data_prevista_desligamento=date.today()
)
self.assertIn("Já existe uma solicitação em andamento", str(ctx.exception))
self.assertEqual(Solicitacao.objects.count(), 1)
self._add_step("Tentativa de criar solicitação duplicada levantou ValidacaoError como esperado.")
def test_enviar_por_nao_solicitante_falha(self):
"""
Garante que PermissaoError é levantada se um usuário que não é
o solicitante original tenta enviar a solicitação.
"""
solicitacao = services.criar_solicitacao_desligamento(
solicitante=self.solicitante, funcionario=self.funcionario,
motivo="Teste de permissão", data_prevista_desligamento=date.today()
)
self._add_step("Solicitação criada pelo solicitante original.")
with self.assertRaises(services.PermissaoError):
# GG tenta enviar uma solicitação que não é dele
services.enviar_solicitacao(solicitacao, usuario=self.aprovador_gg)
self._add_step("Tentativa de envio por outro usuário levantou PermissaoError.")
def test_aprovar_com_perfil_errado_falha(self):
"""
Verifica se PermissaoError é levantada quando um usuário com perfil
inadequado tenta aprovar a etapa do Head.
"""
solicitacao = services.criar_solicitacao_desligamento(
solicitante=self.solicitante, funcionario=self.funcionario,
motivo="Teste de perfil", data_prevista_desligamento=date.today()
)
services.enviar_solicitacao(solicitacao, usuario=self.solicitante)
self._add_step("Solicitação criada e enviada, aguardando aprovação do Head.")
# O usuário da Controladoria tenta aprovar a etapa do Head
with self.assertRaises(services.PermissaoError) as ctx:
services.aprovar_reprovar_por_head(
solicitacao, self.aprovador_controladoria, DecisaoAprovacao.APROVADO, "Aprovação indevida"
)
self.assertIn("Head", str(ctx.exception))
solicitacao.refresh_from_db()
self.assertEqual(solicitacao.status, StatusSolicitacao.AGUARDANDO_HEAD)
self._add_step("Tentativa de aprovação com perfil incorreto levantou PermissaoError.")
# --- Teste de Atomicidade ---
def test_criacao_atomica_falha_nao_persiste_dados(self):
"""
Garante que, se a criação do objeto 'Desligamento' falhar,
a 'Solicitacao' correspondente também não será criada (rollback).
"""
self._add_step("Iniciando teste de transação atômica.")
# Forçamos um erro passando um valor inválido para um campo DateField,
# o que causará um erro ANTES do .save() ser chamado no service.
# Uma abordagem mais robusta seria mockar o .create() para levantar uma exceção.
with self.assertRaises(Exception): # Captura genérica (pode ser ValueError, TypeError, etc)
services.criar_solicitacao_desligamento(
solicitante=self.solicitante,
funcionario=self.funcionario,
motivo="Teste de falha atômica",
data_prevista_desligamento="DATA_INVALIDA", # Isso causará um erro
)
self._add_step("Execução do service com dados inválidos levantou uma exceção.")
# A asserção mais importante: nada deve ter sido criado no banco de dados.
self.assertEqual(Solicitacao.objects.count(), 0)
self.assertEqual(Desligamento.objects.count(), 0)
self._add_step("Confirmado que nenhum registro foi persistido no banco de dados devido ao rollback.")

96
solicitacoes/urls.py Normal file
View File

@ -0,0 +1,96 @@
# /SGMP_PROD/solicitacoes/urls.py
from django.urls import path
from . import views
app_name = "solicitacoes"
urlpatterns = [
# =========================
# DASHBOARD / LISTAGEM
# =========================
path(
"colaboradores/",
views.listar_colaboradores,
name="listar_colaboradores",
),
path(
"solicitacao/<uuid:solicitacao_id>/",
views.solicitacao_detalhe,
name="solicitacao_detalhe",
),
path(
"solicitacoes/todas/",
views.todas_solicitacoes_view,
name="todas_solicitacoes",
),
# =========================
# DESLIGAMENTO
# =========================
path(
"desligamento/criar/<uuid:pessoa_id>/",
views.criar_desligamento,
name="criar_desligamento",
),
# =========================
# ADMISSÃO POR SUBSTITUIÇÃO
# =========================
path(
"admissao/substituicao/criar/<uuid:pessoa_id>/",
views.criar_admissao_substituicao,
name="criar_admissao_substituicao",
),
# =========================
# ADMISSÃO POR AUMENTO DE QUADRO
# =========================
path(
"admissao/aumento/criar/",
views.criar_admissao_aumento_quadro,
name="criar_admissao_aumento_quadro",
),
# =========================
# MOVIMENTAÇÃO
# =========================
path(
"movimentacao/criar/<uuid:pessoa_id>/",
views.criar_movimentacao,
name="criar_movimentacao",
),
# =========================
# AÇÕES DE FLUXO
# =========================
path(
"solicitacao/<uuid:solicitacao_id>/enviar/",
views.enviar_solicitacao,
name="enviar_solicitacao",
),
path(
"solicitacao/<uuid:solicitacao_id>/decidir/",
views.decidir_solicitacao,
name="decidir_solicitacao",
),
path(
"solicitacao/<uuid:solicitacao_id>/parecer/",
views.registrar_parecer_view,
name="registrar_parecer",
),
# =========================
# Autenticação
# =========================
path("login/", views.login_view, name="login"),
path("logout/", views.logout_view, name="logout"),
path("", views.dashboard_view, name="dashboard"),
# =========================
# Gerenciamento
# =========================
path("permissoes/", views.gerenciar_permissoes, name="gerenciar_permissoes"),
]

869
solicitacoes/views.py Normal file
View File

@ -0,0 +1,869 @@
#SGMP_PROD/solicitacoes/views.py
import logging
from datetime import date
from django.contrib.auth import login, logout, get_user_model
from django.contrib import messages
from django.contrib.auth.decorators import login_required
from django.shortcuts import get_object_or_404, redirect, render
from django.utils import timezone
from django.core.paginator import Paginator
from .models import (
HeadGestor,
PessoaRM,
Solicitacao,
UsuarioSistema,
TipoSolicitacao,
DecisaoAprovacao,
StatusSolicitacao,
EtapaAprovacao,
matriculas_gestores_do_head,
UsuarioPerfilExtra,
)
from . import services
from .decorators import pode_criar_solicitacao, requer_perfil
from solicitacoes.intf_winthor import autenticar_usuario, buscar_colaborador_oracle
logger = logging.getLogger(__name__)
def get_usuario_sistema(request) -> UsuarioSistema:
"""
Resolve o usuário autenticado do Django para o UsuarioSistema do SGMP.
"""
return get_object_or_404(
UsuarioSistema,
matricula=request.user.username,
ativo=True
)
@login_required
@pode_criar_solicitacao
def criar_desligamento(request, pessoa_id):
from .intf_sqlserver import verificar_estabilidades_colaborador
funcionario = get_object_or_404(PessoaRM, id=pessoa_id)
usuario = get_usuario_sistema(request)
if request.method == "POST":
tipo_desligamento = request.POST.get("tipo_desligamento", "").strip()
aviso_previo = request.POST.get("aviso_previo", "").strip()
motivo = request.POST.get("motivo", "").strip()
data_prevista_str = request.POST.get("data_prevista_desligamento", "").strip()
observacoes = request.POST.get("observacoes", "") or ""
arquivo_pedido = request.FILES.get("arquivo_pedido")
if not tipo_desligamento or not aviso_previo or not motivo or not data_prevista_str:
messages.error(request, "Preencha todos os campos obrigatórios.")
else:
try:
data_prevista = date.fromisoformat(data_prevista_str)
except ValueError:
messages.error(request, "Data prevista inválida. Use o formato AAAA-MM-DD.")
else:
try:
solicitacao = services.criar_solicitacao_desligamento(
solicitante=usuario,
funcionario=funcionario,
tipo_desligamento=tipo_desligamento,
aviso_previo=aviso_previo,
motivo=motivo,
data_prevista_desligamento=data_prevista,
observacoes=observacoes,
arquivo_pedido=arquivo_pedido,
)
messages.success(request, "Solicitação de desligamento criada com sucesso.")
return redirect("solicitacoes:solicitacao_detalhe", solicitacao_id=solicitacao.id)
except Exception:
logger.exception("Erro ao criar solicitação de desligamento")
messages.error(request, "Não foi possível processar a solicitação. Tente novamente ou contate o suporte.")
# Verifica estabilidades para exibir na UI
estabilidades = verificar_estabilidades_colaborador(funcionario.id_rm)
estabilidades_bloqueantes = [e for e in estabilidades if e.get('bloqueado', False)]
desligamento_bloqueado = len(estabilidades_bloqueantes) > 0
return render(
request,
"solicitacoes/desligamento_form.html",
{
"funcionario": funcionario,
"estabilidades": estabilidades,
"estabilidades_bloqueantes": estabilidades_bloqueantes,
"desligamento_bloqueado": desligamento_bloqueado,
},
)
@login_required
@pode_criar_solicitacao
def criar_admissao_substituicao(request, pessoa_id):
from .intf_sqlserver import listar_cargos_ativos_rm, listar_secoes_ativas_rm
funcionario = get_object_or_404(PessoaRM, id=pessoa_id)
usuario = get_usuario_sistema(request)
if request.method == "POST":
data_previsao_str = request.POST.get("data_previsao", "").strip()
cod_coligada = request.POST.get("cod_coligada", "").strip()
cod_filial = request.POST.get("cod_filial", "").strip()
cod_secao = request.POST.get("cod_secao", "").strip()
cod_funcao = request.POST.get("cod_funcao", "").strip()
justificativa = request.POST.get("justificativa", "").strip()
if not data_previsao_str or not cod_coligada or not cod_filial or not cod_secao or not cod_funcao or not justificativa:
messages.error(request, "Preencha todos os campos obrigatórios.")
else:
try:
data_previsao = date.fromisoformat(data_previsao_str)
except ValueError:
messages.error(request, "Data de previsão inválida. Use o formato AAAA-MM-DD.")
else:
dados = {
"data_previsao_contratacao": data_previsao,
"cod_coligada_destino": cod_coligada,
"cod_filial_destino": cod_filial,
"cod_secao_destino": cod_secao,
"cod_funcao_destino": cod_funcao,
"justificativa": justificativa,
}
try:
solicitacao = services.criar_solicitacao_substituicao(
solicitante=usuario,
funcionario_substituido=funcionario,
dados_admissao=dados,
)
messages.success(request, "Solicitação de admissão por substituição criada.")
return redirect("solicitacoes:solicitacao_detalhe", solicitacao_id=solicitacao.id)
except Exception:
logger.exception("Erro ao criar solicitação de admissão por substituição")
messages.error(request, "Não foi possível processar a solicitação. Tente novamente ou contate o suporte.")
# Busca cargos e seções ativos do RM
cargos = listar_cargos_ativos_rm()
secoes = listar_secoes_ativas_rm()
return render(
request,
"solicitacoes/admissao_substituicao_form.html",
{
"funcionario": funcionario,
"cargos": cargos,
"secoes": secoes,
},
)
@login_required
@pode_criar_solicitacao
def criar_admissao_aumento_quadro(request):
from .intf_sqlserver import (
listar_cargos_ativos_rm,
listar_secoes_ativas_rm,
listar_coligadas_rm,
)
usuario = get_usuario_sistema(request)
if request.method == "POST":
data_previsao_str = request.POST.get("data_previsao", "").strip()
cod_coligada = request.POST.get("cod_coligada", "").strip()
cod_filial = request.POST.get("cod_filial", "").strip()
cod_secao = request.POST.get("cod_secao", "").strip()
cod_funcao = request.POST.get("cod_funcao", "").strip()
justificativa = request.POST.get("justificativa", "").strip()
if not data_previsao_str or not cod_coligada or not cod_filial or not cod_secao or not cod_funcao or not justificativa:
messages.error(request, "Preencha todos os campos obrigatórios.")
else:
try:
data_previsao = date.fromisoformat(data_previsao_str)
except ValueError:
messages.error(request, "Data de previsão inválida. Use o formato AAAA-MM-DD.")
else:
dados = {
"data_previsao_contratacao": data_previsao,
"cod_coligada_destino": cod_coligada,
"cod_filial_destino": cod_filial,
"cod_secao_destino": cod_secao,
"cod_funcao_destino": cod_funcao,
"justificativa_estrategica": justificativa,
}
try:
solicitacao = services.criar_solicitacao_aumento_quadro(
solicitante=usuario,
dados_admissao=dados,
)
messages.success(request, "Solicitação de aumento de quadro criada.")
return redirect("solicitacoes:solicitacao_detalhe", solicitacao_id=solicitacao.id)
except Exception:
logger.exception("Erro ao criar solicitação de aumento de quadro")
messages.error(request, "Não foi possível processar a solicitação. Tente novamente ou contate o suporte.")
# Busca cargos, seções e coligadas ativos do RM (filial é informada manualmente, 113)
cargos = listar_cargos_ativos_rm()
secoes = listar_secoes_ativas_rm()
coligadas = listar_coligadas_rm()
return render(
request,
"solicitacoes/admissao_aumento_form.html",
{
"cargos": cargos,
"secoes": secoes,
"coligadas": coligadas,
},
)
@login_required
@pode_criar_solicitacao
def criar_movimentacao(request, pessoa_id):
from .intf_sqlserver import listar_cargos_ativos_rm, listar_secoes_ativas_rm
funcionario = get_object_or_404(PessoaRM, id=pessoa_id)
usuario = get_usuario_sistema(request)
if request.method == "POST":
data_efetivacao_str = request.POST.get("data_efetivacao", "").strip()
justificativa = request.POST.get("justificativa", "").strip()
if not data_efetivacao_str or not justificativa:
messages.error(request, "Preencha data de efetivação e justificativa.")
else:
try:
data_efetivacao = date.fromisoformat(data_efetivacao_str)
except ValueError:
messages.error(request, "Data de efetivação inválida. Use o formato AAAA-MM-DD.")
else:
dados = {
"altera_funcao": bool(request.POST.get("altera_funcao")),
"altera_centro_custo": bool(request.POST.get("altera_centro_custo")),
"novo_cod_funcao": request.POST.get("novo_cod_funcao"),
"novo_cod_secao": request.POST.get("novo_cod_secao"),
"novo_salario": request.POST.get("novo_salario") or None,
"data_efetivacao": data_efetivacao,
"justificativa": justificativa,
}
try:
solicitacao = services.criar_solicitacao_movimentacao(
solicitante=usuario,
funcionario=funcionario,
dados_movimentacao=dados,
)
messages.success(request, "Solicitação de movimentação criada.")
return redirect("solicitacoes:solicitacao_detalhe", solicitacao_id=solicitacao.id)
except Exception:
logger.exception("Erro ao criar solicitação de movimentação")
messages.error(request, "Não foi possível processar a solicitação. Tente novamente ou contate o suporte.")
# Busca cargos e seções ativos do RM
cargos = listar_cargos_ativos_rm()
secoes = listar_secoes_ativas_rm()
return render(
request,
"solicitacoes/movimentacao_form.html",
{
"funcionario": funcionario,
"cargos": cargos,
"secoes": secoes,
},
)
@login_required
def enviar_solicitacao(request, solicitacao_id):
solicitacao = get_object_or_404(Solicitacao, id=solicitacao_id)
usuario = get_usuario_sistema(request)
try:
services.enviar_solicitacao(solicitacao, usuario)
messages.success(request, "Solicitação enviada para aprovação.")
except Exception:
logger.exception("Erro ao enviar solicitação")
messages.error(request, "Não foi possível enviar a solicitação. Tente novamente ou contate o suporte.")
return redirect("solicitacoes:solicitacao_detalhe", solicitacao_id=solicitacao.id)
@login_required
@requer_perfil(UsuarioSistema.Perfil.HEAD, UsuarioSistema.Perfil.DIRETORIA)
def decidir_solicitacao(request, solicitacao_id):
"""
View para HEAD ou DIRETORIA aprovar/reprovar solicitações.
HEAD atua quando status é AGUARDANDO_HEAD; DIRETORIA quando é AGUARDANDO_DIRETORIA.
"""
solicitacao = get_object_or_404(Solicitacao, id=solicitacao_id)
usuario = get_usuario_sistema(request)
if request.method == "POST":
decisao = request.POST.get("decisao", "").strip()
justificativa = request.POST.get("justificativa", "").strip()
try:
if (
solicitacao.status == StatusSolicitacao.AGUARDANDO_HEAD
and usuario.tem_perfil(UsuarioSistema.Perfil.HEAD)
):
services.aprovar_reprovar_por_head(
solicitacao=solicitacao,
aprovador=usuario,
decisao=decisao,
justificativa=justificativa,
)
messages.success(request, "Decisão registrada com sucesso.")
elif (
solicitacao.status == StatusSolicitacao.AGUARDANDO_DIRETORIA
and usuario.tem_perfil(UsuarioSistema.Perfil.DIRETORIA)
):
services.aprovar_reprovar_solicitacao(
solicitacao=solicitacao,
aprovador=usuario,
decisao=decisao,
justificativa=justificativa,
)
messages.success(request, "Decisão registrada com sucesso.")
else:
messages.error(request, "Solicitação não está aguardando sua decisão.")
except Exception:
logger.exception("Erro ao registrar decisão da solicitação")
messages.error(request, "Não foi possível registrar a decisão. Tente novamente ou contate o suporte.")
return redirect("solicitacoes:solicitacao_detalhe", solicitacao_id=solicitacao.id)
@login_required
@requer_perfil(UsuarioSistema.Perfil.GG, UsuarioSistema.Perfil.CONTROLADORIA)
def registrar_parecer_view(request, solicitacao_id):
"""
View para GG e CONTROLADORIA registrarem pareceres.
Permite anexar arquivos junto com o parecer.
"""
solicitacao = get_object_or_404(Solicitacao, id=solicitacao_id)
usuario = get_usuario_sistema(request)
if request.method == "POST":
texto = request.POST.get("texto", "").strip()
anexo = request.FILES.get("anexo")
if not texto:
messages.error(request, "O parecer não pode estar vazio.")
else:
try:
services.registrar_parecer(
solicitacao=solicitacao,
usuario=usuario,
texto=texto,
anexo=anexo
)
messages.success(request, "Parecer registrado com sucesso.")
except Exception:
logger.exception("Erro ao registrar parecer")
messages.error(request, "Não foi possível registrar o parecer. Tente novamente ou contate o suporte.")
return redirect("solicitacoes:solicitacao_detalhe", solicitacao_id=solicitacao.id)
@login_required
def solicitacao_detalhe(request, solicitacao_id):
solicitacao = get_object_or_404(Solicitacao, id=solicitacao_id)
usuario = get_usuario_sistema(request)
# Verifica se o usuário é o solicitante
is_solicitante = solicitacao.solicitante.id == usuario.id
# Verifica se pode aprovar (apenas pela etapa/perfil, não bloqueia o solicitante)
pode_aprovar = solicitacao.pode_aprovar(usuario)
# Verifica se pode dar parecer
pode_dar_parecer = solicitacao.pode_dar_parecer(usuario)
# Busca pareceres existentes
pareceres_gg = solicitacao.pareceres.filter(etapa=EtapaAprovacao.GG)
pareceres_controladoria = solicitacao.pareceres.filter(etapa=EtapaAprovacao.CONTROLADORIA)
# Calcula horas do banco de horas se houver funcionário
horas_banco_horas = None
if solicitacao.funcionario and solicitacao.funcionario.saldo_banco_horas_minutos is not None:
try:
horas_banco_horas = float(solicitacao.funcionario.saldo_banco_horas_minutos) / 60.0
except (ValueError, TypeError):
horas_banco_horas = None
# Busca dados do Winthor se houver funcionário com CPF
dados_winthor = None
dados_winthor_organizados = None
if solicitacao.funcionario and solicitacao.funcionario.cpf:
try:
dados_winthor = buscar_colaborador_oracle(solicitacao.funcionario.cpf)
if dados_winthor:
dados_winthor_organizados = {
"basicos": {
"matricula": dados_winthor.get("matricula"),
"nome": dados_winthor.get("nome"),
"cpf": dados_winthor.get("cpf"),
},
"admissao": {
"admissao": dados_winthor.get("admissao"),
"situacao": dados_winthor.get("situacao"),
"dt_exclusao": dados_winthor.get("dt_exclusao"),
},
"endereco": {
"endereco": dados_winthor.get("endereco"),
"bairro": dados_winthor.get("bairro"),
"cidade": dados_winthor.get("cidade"),
"estado": dados_winthor.get("estado"),
}
}
except Exception:
logger.exception("Erro ao buscar dados do Winthor")
return render(
request,
"solicitacoes/solicitacao_detalhe.html",
{
"solicitacao": solicitacao,
"is_solicitante": is_solicitante,
"pode_aprovar": pode_aprovar,
"pode_dar_parecer": pode_dar_parecer,
"pareceres_gg": pareceres_gg,
"pareceres_controladoria": pareceres_controladoria,
"horas_banco_horas": horas_banco_horas,
"dados_winthor": dados_winthor,
"dados_winthor_organizados": dados_winthor_organizados,
},
)
# auth
User = get_user_model()
def login_view(request):
if request.user.is_authenticated:
# CORREÇÃO AQUI: adicionado solicitacoes:
return redirect("solicitacoes:dashboard")
if request.method == "POST":
login_input = request.POST.get("username", "").strip()
senha = request.POST.get("password", "").strip()
if not login_input or not senha:
messages.error(request, "Informe usuário e senha.")
return render(request, "auth/login.html")
# Chama a autenticação do Winthor
# Espera retorno dict: {'matricula': '123', 'nome': 'Fulano', 'usuariobd': 'FULANO.SILVA'}
dados = autenticar_usuario(login_input, senha)
if not dados:
messages.error(request, "Usuário ou senha inválidos no Winthor.")
return render(request, "auth/login.html")
# TRUQUE DE INTEGRAÇÃO:
# Salvamos o User do Django usando a MATRÍCULA como username.
# Isso garante que o get_usuario_sistema funcione corretamente.
user, _ = User.objects.get_or_create(
username=str(dados["matricula"]),
defaults={
"first_name": dados.get("nome", "Usuario").split(" ")[0],
},
)
# Loga no Django (sessão)
login(request, user)
# Atualiza/Cria o UsuarioSistema (Domínio)
# Se já existe, mantém o perfil atual. Se é novo, define como GESTOR por padrão
usuario_sistema, created = UsuarioSistema.objects.get_or_create(
matricula=str(dados["matricula"]),
defaults={
"nome": dados["nome"],
"ativo": True,
"perfil": UsuarioSistema.Perfil.GESTOR, # Default para novos usuários
},
)
# Se já existia, apenas atualiza o nome (mantém perfil e status)
if not created:
usuario_sistema.nome = dados["nome"]
usuario_sistema.ativo = True
usuario_sistema.save()
messages.success(request, f"Bem-vindo, {dados['nome']}!")
# O 'next' pega a url que o usuário tentou acessar antes de logar
next_url = request.GET.get("next", "solicitacoes:dashboard")
return redirect(next_url)
return render(request, "auth/login.html")
@login_required
def logout_view(request):
logout(request)
messages.info(request, "Você saiu do sistema.")
return redirect("solicitacoes:login")
@login_required
def dashboard_view(request):
usuario = get_usuario_sistema(request)
# Busca solicitações baseado no perfil
if usuario.perfil == UsuarioSistema.Perfil.GESTOR:
# Gestores veem suas próprias solicitações (todas, incluindo rascunhos)
qs_base = Solicitacao.objects.filter(solicitante=usuario)
solicitacoes = qs_base.order_by('-criado_em')
elif usuario.perfil == UsuarioSistema.Perfil.HEAD:
# Head vê solicitações AGUARDANDO_HEAD cujo solicitante está na sua lista de gestores
matriculas = matriculas_gestores_do_head(usuario)
qs_base = Solicitacao.objects.filter(status=StatusSolicitacao.AGUARDANDO_HEAD)
if matriculas:
qs_base = qs_base.filter(solicitante__matricula__in=matriculas)
solicitacoes = qs_base.order_by('-criado_em')
elif usuario.perfil in [UsuarioSistema.Perfil.GG, UsuarioSistema.Perfil.CONTROLADORIA]:
# GG e Controladoria veem solicitações ENVIADAS para dar parecer
# Verifica se já deram parecer para filtrar
qs_base = Solicitacao.objects.filter(status=StatusSolicitacao.ENVIADA)
# Filtra para mostrar apenas solicitações onde o usuário ainda não deu parecer
etapa_esperada = EtapaAprovacao.GG if usuario.perfil == UsuarioSistema.Perfil.GG else EtapaAprovacao.CONTROLADORIA
qs_base = qs_base.exclude(pareceres__etapa=etapa_esperada, pareceres__usuario=usuario)
solicitacoes = qs_base.order_by('-enviada_em', '-criado_em')
elif usuario.perfil == UsuarioSistema.Perfil.DIRETORIA:
# Diretoria vê solicitações AGUARDANDO_DIRETORIA para aprovar/reprovar
qs_base = Solicitacao.objects.filter(status=StatusSolicitacao.AGUARDANDO_DIRETORIA)
solicitacoes = qs_base.order_by('-enviada_em', '-criado_em')
else:
qs_base = Solicitacao.objects.none()
solicitacoes = Solicitacao.objects.none()
# Calcula contadores baseado no queryset
finalizados = [StatusSolicitacao.FINALIZADA, StatusSolicitacao.REPROVADA]
total = qs_base.count()
pendentes = qs_base.exclude(status__in=finalizados).count()
# Para gestores, ajusta os contadores considerando todos os status
if usuario.perfil == UsuarioSistema.Perfil.GESTOR:
# Total: todas as solicitações
total = qs_base.count()
# Pendentes: rascunho, enviada, aprovadas em etapas intermediárias
pendentes = qs_base.exclude(status__in=[StatusSolicitacao.FINALIZADA, StatusSolicitacao.REPROVADA]).count()
# Paginação
paginator = Paginator(solicitacoes, 10)
page = request.GET.get('page')
solicitacoes_page = paginator.get_page(page)
# Prepara informações sobre quais solicitações podem ser aprovadas ou receber parecer
solicitacoes_com_acao = []
for solicitacao in solicitacoes_page:
is_solicitante = solicitacao.solicitante.id == usuario.id
pode_aprovar = solicitacao.pode_aprovar(usuario)
pode_dar_parecer = solicitacao.pode_dar_parecer(usuario)
# Busca dados do Winthor se houver funcionário com CPF
dados_winthor_organizados = None
if solicitacao.funcionario and solicitacao.funcionario.cpf:
try:
dados_winthor = buscar_colaborador_oracle(solicitacao.funcionario.cpf)
if dados_winthor:
dados_winthor_organizados = {
"basicos": {
"matricula": dados_winthor.get("matricula"),
"nome": dados_winthor.get("nome"),
"cpf": dados_winthor.get("cpf"),
},
"admissao": {
"admissao": dados_winthor.get("admissao"),
"situacao": dados_winthor.get("situacao"),
"dt_exclusao": dados_winthor.get("dt_exclusao"),
},
"endereco": {
"endereco": dados_winthor.get("endereco"),
"bairro": dados_winthor.get("bairro"),
"cidade": dados_winthor.get("cidade"),
"estado": dados_winthor.get("estado"),
}
}
except Exception:
# Ignora erros silenciosamente no dashboard
pass
solicitacoes_com_acao.append({
'solicitacao': solicitacao,
'pode_aprovar': pode_aprovar,
'pode_dar_parecer': pode_dar_parecer,
'is_solicitante': is_solicitante,
'dados_winthor_organizados': dados_winthor_organizados,
})
return render(request, "dashboard.html", {
"solicitacoes": solicitacoes_page,
"solicitacoes_com_acao": solicitacoes_com_acao,
"total": total,
"pendentes": pendentes,
})
@login_required
def todas_solicitacoes_view(request):
"""Listagem de solicitações: Gestor não acessa; Head vê só dos gestores vinculados a ele; GG/Controladoria/Diretoria veem todas."""
usuario = get_usuario_sistema(request)
if usuario.perfil == UsuarioSistema.Perfil.GESTOR:
return redirect("solicitacoes:dashboard")
qs_base = Solicitacao.objects.all().order_by("-criado_em")
# Head: apenas solicitações dos gestores que ele aprova (subordinados imediatos)
if usuario.perfil == UsuarioSistema.Perfil.HEAD:
matriculas = matriculas_gestores_do_head(usuario)
if matriculas:
qs_base = qs_base.filter(solicitante__matricula__in=matriculas)
else:
qs_base = qs_base.none()
# Filtro por status (GET)
filtro_status = request.GET.get("status", "").strip()
if filtro_status:
qs_base = qs_base.filter(status=filtro_status)
total = qs_base.count()
# Paginação
paginator = Paginator(qs_base, 20)
page = request.GET.get("page")
solicitacoes_page = paginator.get_page(page)
# Contexto de ação por solicitação (pode_aprovar, pode_dar_parecer, etc.)
solicitacoes_com_acao = []
for solicitacao in solicitacoes_page:
is_solicitante = solicitacao.solicitante.id == usuario.id
pode_aprovar = solicitacao.pode_aprovar(usuario)
pode_dar_parecer = solicitacao.pode_dar_parecer(usuario)
dados_winthor_organizados = None
if solicitacao.funcionario and solicitacao.funcionario.cpf:
try:
dados_winthor = buscar_colaborador_oracle(solicitacao.funcionario.cpf)
if dados_winthor:
dados_winthor_organizados = {
"basicos": {
"matricula": dados_winthor.get("matricula"),
"nome": dados_winthor.get("nome"),
"cpf": dados_winthor.get("cpf"),
},
"admissao": {
"admissao": dados_winthor.get("admissao"),
"situacao": dados_winthor.get("situacao"),
"dt_exclusao": dados_winthor.get("dt_exclusao"),
},
"endereco": {
"endereco": dados_winthor.get("endereco"),
"bairro": dados_winthor.get("bairro"),
"cidade": dados_winthor.get("cidade"),
"estado": dados_winthor.get("estado"),
},
}
except Exception:
pass
solicitacoes_com_acao.append({
"solicitacao": solicitacao,
"pode_aprovar": pode_aprovar,
"pode_dar_parecer": pode_dar_parecer,
"is_solicitante": is_solicitante,
"dados_winthor_organizados": dados_winthor_organizados,
})
return render(request, "solicitacoes/todas_solicitacoes.html", {
"solicitacoes": solicitacoes_page,
"solicitacoes_com_acao": solicitacoes_com_acao,
"total": total,
"filtro_status": filtro_status,
"status_choices": StatusSolicitacao.choices,
})
@login_required
@pode_criar_solicitacao
def listar_colaboradores(request):
"""
Lista colaboradores para seleção ao criar solicitação.
Aceita parâmetro 'tipo' na URL:
- 'substituicao': busca apenas pessoas DESLIGADAS diretamente do RM (para admissão por substituição)
- outros ou ausente: busca pessoas que não estão desligadas do banco local (padrão)
"""
from .intf_sqlserver import buscar_colaboradores_rm_desligados
from .models import PessoaRM
# Verifica se é para admissão por substituição
tipo = request.GET.get('tipo', '')
apenas_desligados = (tipo == 'substituicao')
busca = request.GET.get('q', '')
# Para admissão por substituição: busca direto no RM (como no sgmp)
if apenas_desligados:
# Busca direto no SQL Server para garantir dados atualizados
resultados_rm = buscar_colaboradores_rm_desligados(nome=busca if busca else None)
# Converte resultados do RM para formato compatível com o template
colaboradores_list = []
for row in resultados_rm:
id_rm = f"{row['CODCOLIGADA']}-{row['CHAPA']}"
# Tenta encontrar no banco local ou sincroniza
try:
pessoa = PessoaRM.objects.get(id_rm=id_rm)
except PessoaRM.DoesNotExist:
# Sincroniza a pessoa no banco local com os dados do RM
# pymssql retorna chaves em maiúsculas por padrão
pessoa, _ = PessoaRM.objects.update_or_create(
id_rm=id_rm,
defaults={
"matricula": row['CHAPA'],
"nome": row['NOME'],
"cpf": row.get('CPF'),
"cargo": row['FUNCAO'],
"setor": row['SECAO'],
"centro_custo": row['CODSECAO'],
"situacao": row['CODSITUACAO'],
"cod_funcao": row.get('CODFUNCAO'),
"salario": row.get('SALARIO'),
"cod_sindicato": row.get('CODSINDICATO'),
}
)
colaboradores_list.append(pessoa)
# Paginação manual
paginator = Paginator(colaboradores_list, 20)
page = request.GET.get('page')
colaboradores_page = paginator.get_page(page)
else:
# Padrão: busca pessoas que não estão desligadas do banco local
colaboradores = PessoaRM.objects.exclude(situacao='D').order_by('nome')
# Busca por nome ou matrícula
if busca:
colaboradores = colaboradores.filter(
nome__icontains=busca
) | colaboradores.filter(
matricula__icontains=busca
)
# Paginação
paginator = Paginator(colaboradores, 20)
page = request.GET.get('page')
colaboradores_page = paginator.get_page(page)
return render(request, "solicitacoes/listar_colaboradores.html", {
"colaboradores": colaboradores_page,
"busca": busca,
"tipo": tipo,
"apenas_desligados": apenas_desligados,
})
@login_required
def gerenciar_permissoes(request):
"""View para gerenciar permissões de usuários. Para perfil HEAD, permite vincular gestores (em relação a quem o Head aprova)."""
usuario_atual = get_usuario_sistema(request)
# Pré-carrega perfis extras para evitar N+1
todos_usuarios = list(
UsuarioSistema.objects.all()
.prefetch_related("perfis_extras")
.order_by("nome")
)
# Gestores são usuários que possuem o perfil GESTOR (principal ou extra)
gestores_lista = [u for u in todos_usuarios if u.tem_perfil(UsuarioSistema.Perfil.GESTOR)]
usuarios = todos_usuarios
# Busca
busca = request.GET.get('q', '')
if busca:
usuarios = usuarios.filter(
nome__icontains=busca
) | usuarios.filter(
matricula__icontains=busca
)
if request.method == "POST":
# Salvar gestores vinculados ao Head (formulário "Este Head aprova os gestores:")
gestores_head_id = request.POST.get("gestores_head_id")
if gestores_head_id:
try:
head = UsuarioSistema.objects.get(id=gestores_head_id)
if not head.tem_perfil(UsuarioSistema.Perfil.HEAD):
messages.error(request, "Usuário selecionado não possui perfil de Head.")
else:
gestores_ids = request.POST.getlist("gestores_ids")
HeadGestor.objects.filter(head=head).delete()
# Mantém apenas vínculos com usuários que possuem perfil de Gestor (principal ou extra)
candidatos = UsuarioSistema.objects.filter(id__in=gestores_ids).prefetch_related("perfis_extras")
for gestor in candidatos:
if gestor.tem_perfil(UsuarioSistema.Perfil.GESTOR):
HeadGestor.objects.get_or_create(head=head, gestor=gestor)
messages.success(request, f"Gestores vinculados ao Head {head.nome} atualizados.")
except UsuarioSistema.DoesNotExist:
messages.error(request, "Head não encontrado.")
except Exception:
logger.exception("Erro ao salvar vínculos Head-Gestor")
messages.error(request, "Não foi possível salvar os vínculos. Tente novamente ou contate o suporte.")
return redirect("solicitacoes:gerenciar_permissoes")
# Atualização de perfil principal + perfis extras
usuario_id = request.POST.get("usuario_id")
novo_perfil = request.POST.get("perfil")
if usuario_id and novo_perfil:
try:
usuario_editado = UsuarioSistema.objects.get(id=usuario_id)
usuario_editado.perfil = novo_perfil
usuario_editado.save()
# Perfis extras selecionados no formulário
perfis_extras_selecionados = set(request.POST.getlist("perfis_extras"))
# Remove eventual duplicidade com o perfil principal
perfis_extras_selecionados.discard(novo_perfil)
# Sincroniza perfis extras no banco
UsuarioPerfilExtra.objects.filter(usuario=usuario_editado).exclude(
perfil__in=perfis_extras_selecionados
).delete()
for codigo_perfil in perfis_extras_selecionados:
UsuarioPerfilExtra.objects.get_or_create(
usuario=usuario_editado,
perfil=codigo_perfil,
)
if usuario_editado.id == usuario_atual.id:
messages.success(
request,
f"Seu perfil foi atualizado para: {usuario_editado.get_perfil_display()}",
)
else:
messages.success(
request,
f"Perfil de {usuario_editado.nome} atualizado para: {usuario_editado.get_perfil_display()}",
)
except UsuarioSistema.DoesNotExist:
messages.error(request, "Usuário não encontrado.")
except Exception:
logger.exception("Erro ao atualizar perfil")
messages.error(request, "Não foi possível atualizar o perfil. Tente novamente ou contate o suporte.")
return redirect("solicitacoes:gerenciar_permissoes")
# Lista de gestores (para o multi-select / listas dos Heads)
gestores = gestores_lista
# Paginação
paginator = Paginator(usuarios, 20)
page = request.GET.get('page')
usuarios_page = paginator.get_page(page)
# head_id -> lista de gestor_id já vinculados (apenas para usuários da página atual)
head_gestores = {}
for row in HeadGestor.objects.filter(head__in=list(usuarios_page)).values_list("head_id", "gestor_id"):
head_gestores.setdefault(str(row[0]), []).append(str(row[1]))
# Para o template: cada item tem usuario, seus perfis extras e lista (gestor, selected) para o multi-select HEAD
usuarios_com_gestores = [
{
"usuario": u,
"perfis_extras": list(u.perfis_extras.values_list("perfil", flat=True)),
"gestores_com_selecao": [
(g, str(g.id) in head_gestores.get(str(u.id), []))
for g in gestores
],
}
for u in usuarios_page
]
return render(request, "solicitacoes/gerenciar_permissoes.html", {
"usuarios_com_gestores": usuarios_com_gestores,
"busca": busca,
"perfis": UsuarioSistema.Perfil.choices,
"gestores": gestores,
})

View File

@ -0,0 +1,14 @@
{% extends "admin/change_list.html" %}
{% block object-tools-items %}
<div class="object-tools">
<ul>
<li>
<a href="sync-rm/" class="button">
🔄 Sincronizar com RM
</a>
</li>
</ul>
</div>
{{ block.super }}
{% endblock %}

272
templates/auth/login.html Normal file
View File

@ -0,0 +1,272 @@
<!DOCTYPE html>
<html lang="pt-br">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Login | SGMP PROD</title>
<link rel="icon" type="image/svg+xml" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><text y='.9em' font-size='90'>📊</text></svg>">
<style>
/*
* CSS LOCAL
* Isolado para não afetar o restante do sistema (base.html)
* Design moderno sem frameworks (Bootstrap/Tailwind)
*/
:root {
--primary-color: #2563eb; /* Azul corporativo */
--primary-hover: #1d4ed8;
--bg-left: linear-gradient(135deg, #1e3a8a 0%, #3b82f6 100%);
--text-color: #333333;
--text-muted: #666666;
--border-color: #e5e7eb;
--radius: 8px;
}
* {
box-sizing: border-box;
margin: 0;
padding: 0;
}
body {
font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
height: 100vh;
display: flex;
overflow: hidden; /* Evita scroll desnecessário */
}
/* LAYOUT DIVIDIDO */
.login-wrapper {
display: flex;
width: 100%;
height: 100%;
}
/* PAINEL ESQUERDO (VISUAL) */
.panel-visual {
flex: 1;
background: var(--bg-left);
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
color: white;
padding: 2rem;
text-align: center;
position: relative;
}
/* DETALHE DISCRETO: Badge PROD no canto superior direito */
.prod-badge {
position: absolute;
top: 20px;
right: 20px;
background: rgba(255, 255, 255, 0.15);
backdrop-filter: blur(10px);
padding: 6px 12px;
border-radius: 20px;
font-size: 0.75rem;
font-weight: 600;
letter-spacing: 0.5px;
border: 1px solid rgba(255, 255, 255, 0.2);
}
.panel-visual h1 {
font-size: 3rem;
margin-bottom: 1rem;
letter-spacing: -1px;
}
.panel-visual p {
font-size: 1.2rem;
opacity: 0.9;
max-width: 400px;
}
/* PAINEL DIREITO (FORMULÁRIO) */
.panel-form {
flex: 1;
display: flex;
justify-content: center;
align-items: center;
background-color: #ffffff;
padding: 2rem;
}
.login-card {
width: 100%;
max-width: 400px;
padding: 2rem;
/* Opcional: Borda suave se o fundo não for branco puro */
}
.login-header {
margin-bottom: 2rem;
}
.login-header h2 {
font-size: 1.8rem;
color: var(--text-color);
margin-bottom: 0.5rem;
}
.login-header p {
color: var(--text-muted);
}
/* ESTILIZAÇÃO DO FORMULÁRIO */
form p {
margin-bottom: 1rem;
}
/* Labels */
form label {
display: block;
margin-bottom: 0.5rem;
font-weight: 500;
color: var(--text-color);
font-size: 0.9rem;
}
/* Inputs */
form input[type="text"],
form input[type="password"],
form input[type="email"] {
width: 100%;
padding: 0.75rem 1rem;
border: 1px solid var(--border-color);
border-radius: var(--radius);
font-size: 1rem;
transition: border-color 0.2s;
outline: none;
}
form input:focus {
border-color: var(--primary-color);
box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.1);
}
/* Botão de Submit */
.btn-submit {
width: 100%;
padding: 0.8rem;
background-color: var(--primary-color);
color: white;
border: none;
border-radius: var(--radius);
font-size: 1rem;
font-weight: 600;
cursor: pointer;
margin-top: 1rem;
transition: background-color 0.2s;
}
.btn-submit:hover {
background-color: var(--primary-hover);
}
/* MENSAGENS DE ERRO */
.messages-container {
margin-bottom: 1.5rem;
}
.alert {
padding: 0.75rem;
border-radius: var(--radius);
font-size: 0.9rem;
margin-bottom: 0.5rem;
background-color: #fee2e2;
color: #991b1b;
border: 1px solid #fecaca;
}
.alert.success {
background-color: #d1fae5;
color: #065f46;
border-color: #a7f3d0;
}
.errorlist {
list-style: none;
color: #dc2626;
font-size: 0.85rem;
margin-top: 0.25rem;
}
/* TEXTO DE AJUDA */
.helptext {
display: block;
font-size: 0.75rem;
color: var(--text-muted);
margin-top: 0.25rem;
}
/* RESPONSIVIDADE */
@media (max-width: 768px) {
.panel-visual {
display: none; /* Esconde o painel visual em telas pequenas */
}
}
</style>
</head>
<body>
<div class="login-wrapper">
<!-- Painel Esquerdo: Decorativo -->
<div class="panel-visual">
<!-- Badge PROD discreto -->
<div class="prod-badge">PROD</div>
<h1>SGMP</h1>
<p>Sistema de Gestão e Movimentações de Pessoas</p>
</div>
<!-- Painel Direito: Formulário -->
<div class="panel-form">
<div class="login-card">
<div class="login-header">
<h2>Bem-vindo</h2>
<p>Insira suas credenciais para acessar.</p>
</div>
<!-- Bloco de Mensagens do Django -->
{% if messages %}
<div class="messages-container">
{% for message in messages %}
<div class="alert {{ message.tags }}">
{{ message }}
</div>
{% endfor %}
</div>
{% endif %}
<!-- Formulário -->
<form method="post">
{% csrf_token %}
<p>
<label for="username">Usuário:</label>
<input type="text" name="username" id="username" placeholder="Matrícula Winthor" required autofocus>
</p>
<p>
<label for="password">Senha:</label>
<input type="password" name="password" id="password" placeholder="Senha Winthor" required>
</p>
<button type="submit" class="btn-submit">Entrar</button>
<!-- Campo oculto "next" para redirecionamento pós-login -->
{% if request.GET.next %}
<input type="hidden" name="next" value="{{ request.GET.next }}">
{% endif %}
</form>
</div>
</div>
</div>
</body>
</html>

242
templates/base.html Normal file
View File

@ -0,0 +1,242 @@
{% load static %}
<!DOCTYPE html>
<html lang="pt-br">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{% block title %}SGMP - Gestão de Pessoas{% endblock %}</title>
<link rel="icon" type="image/svg+xml" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><text y='.9em' font-size='90'>📊</text></svg>">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap" rel="stylesheet">
<script src="https://cdn.tailwindcss.com"></script>
<script>
tailwind.config = {
theme: {
extend: {
colors: {
primary: '#2563eb',
'primary-hover': '#1d4ed8',
'sidebar-bg': '#0f172a',
'sidebar-border': '#1e293b',
},
fontFamily: { sans: ['Inter', 'sans-serif'] },
}
}
}
</script>
<style>
.sidebar.collapsed { width: 72px; }
.sidebar.collapsed .brand { display: none; }
.sidebar.collapsed .sidebar-header { justify-content: center; padding: 0; }
.sidebar.collapsed .nav-item { justify-content: center; padding: 10px 0; }
.sidebar.collapsed .link-text { opacity: 0; width: 0; display: none; overflow: hidden; }
.sidebar.collapsed .user-info { display: none; }
.sidebar.collapsed .user-section { padding: 16px 0; justify-content: center; }
.wizard-overlay { display: none; }
.wizard-overlay.show { opacity: 1; }
.wizard-overlay.show .wizard-box { transform: scale(1); }
.wizard-step { display: none; }
.wizard-step.active { display: block; }
@media (max-width: 768px) {
.sidebar { position: absolute; height: 100%; width: 260px; transform: translateX(-100%); }
.sidebar.active { transform: translateX(0); }
.sidebar.collapsed { width: 260px; transform: translateX(-100%); }
.sidebar-overlay { display: none; }
.sidebar.active + .sidebar-overlay { display: block; }
}
</style>
{% block css %}{% endblock %}
</head>
<body class="font-sans bg-slate-100 text-slate-700 m-0 p-0 h-screen overflow-hidden antialiased">
<div class="flex w-full h-screen">
<button type="button" class="mobile-menu-btn block md:hidden fixed top-4 left-4 z-40 bg-white border border-slate-200 rounded-md p-2 shadow md:hidden" onclick="toggleSidebarMobile()">
<span class="text-lg"></span>
</button>
<nav id="sidebar" class="sidebar flex flex-col w-[260px] flex-shrink-0 bg-slate-900 text-white border-r border-slate-800 relative z-50 transition-[width] duration-300 ease-out">
<div class="sidebar-header h-16 flex items-center justify-between px-5 border-b border-slate-800">
<div class="brand text-lg font-bold tracking-tight text-white whitespace-nowrap overflow-hidden">SGMP <span>CORP</span></div>
<button type="button" class="toggle-btn bg-transparent border-none text-slate-400 text-xl flex items-center justify-center p-1 rounded hover:text-white hover:bg-slate-800 transition-colors" onclick="toggleSidebarDesktop()" title="Recolher Menu">
<span>«</span>
</button>
</div>
<div class="nav-links py-5 px-3 flex flex-col gap-1.5 flex-grow overflow-y-auto">
<a href="{% url 'solicitacoes:dashboard' %}" class="nav-item flex items-center py-2.5 px-3 rounded-md text-slate-400 text-sm font-medium no-underline border-none bg-transparent w-full cursor-pointer transition-all hover:text-white hover:bg-slate-800" title="Dashboard">
<span class="link-icon text-base min-w-[24px] flex items-center justify-center">📊</span>
<span class="link-text ml-3 whitespace-nowrap overflow-hidden">Dashboard</span>
</a>
{% if user.is_authenticated and usuario_sistema and usuario_sistema.perfil != 'GESTOR' %}
<a href="{% url 'solicitacoes:todas_solicitacoes' %}" class="nav-item flex items-center py-2.5 px-3 rounded-md text-slate-400 text-sm font-medium no-underline border-none bg-transparent w-full cursor-pointer transition-all hover:text-white hover:bg-slate-800" title="Todas as solicitações">
<span class="link-icon text-base min-w-[24px] flex items-center justify-center">📑</span>
<span class="link-text ml-3 whitespace-nowrap overflow-hidden">Todas as solicitações</span>
</a>
{% endif %}
{% if user.is_authenticated and usuario_sistema and usuario_sistema.perfil == 'GESTOR' %}
<button type="button" onclick="openWizard()" class="nav-item flex items-center py-2.5 px-3 rounded-md text-slate-400 text-sm font-medium border-none bg-transparent w-full cursor-pointer transition-all hover:text-white hover:bg-slate-800 text-left" title="Criar Solicitação">
<span class="link-icon text-base min-w-[24px] flex items-center justify-center"></span>
<span class="link-text ml-3 whitespace-nowrap overflow-hidden">Nova Solicitação</span>
</button>
{% endif %}
</div>
{% if user.is_authenticated %}
<div class="user-section py-4 px-4 bg-slate-950 border-t border-slate-800">
<a href="{% url 'solicitacoes:logout' %}" class="user-profile flex items-center gap-3 text-white no-underline overflow-hidden" title="Sair">
<div class="avatar w-8 h-8 rounded-full bg-primary flex items-center justify-center font-semibold text-sm flex-shrink-0">
{% if usuario_sistema %}{{ usuario_sistema.nome|make_list|first }}{% else %}{{ user.username|make_list|first }}{% endif %}
</div>
<div class="user-info flex flex-col whitespace-nowrap overflow-hidden">
<span class="user-name text-sm font-semibold">{% if usuario_sistema %}{{ usuario_sistema.nome }}{% else %}{{ user.username }}{% endif %}</span>
<span class="user-role text-xs text-slate-400">{% if usuario_sistema %}{{ usuario_sistema.get_perfil_display }}{% else %}Usuário{% endif %}</span>
</div>
<span class="link-icon ml-auto text-red-500" title="Sair">🚪</span>
</a>
</div>
{% endif %}
</nav>
<div class="sidebar-overlay fixed inset-0 bg-black/50 z-[45] backdrop-blur-sm md:hidden" onclick="toggleSidebarMobile()"></div>
<main class="main-content flex-grow overflow-y-auto h-screen bg-slate-100 relative">
<div class="container max-w-[1200px] mx-auto py-8 px-8">
{% block content %}{% endblock %}
</div>
</main>
</div>
<div id="createWizard" class="wizard-overlay fixed inset-0 bg-slate-900/60 z-[1000] flex items-center justify-center backdrop-blur-sm opacity-0 transition-opacity duration-200">
<div class="wizard-box bg-white w-full max-w-2xl rounded-xl shadow-2xl overflow-hidden flex flex-col max-h-[85vh] scale-95 transition-transform duration-200">
<div class="wizard-header py-5 px-6 border-b border-slate-200 flex justify-between items-center bg-white">
<h3 id="wizardTitle" class="m-0 text-lg font-semibold text-slate-800">Iniciar Novo Processo</h3>
<button type="button" class="close-wizard bg-transparent border-none text-xl text-slate-500 w-8 h-8 rounded-md flex items-center justify-center cursor-pointer hover:bg-slate-100 hover:text-slate-800 transition-colors" onclick="closeWizard()">×</button>
</div>
<div class="wizard-body p-6 overflow-y-auto bg-white">
<div id="step1" class="wizard-step active">
<p class="text-slate-600 mb-5">Qual tipo de movimentação você deseja realizar hoje?</p>
<div class="type-grid grid grid-cols-1 sm:grid-cols-2 gap-4">
<div class="type-card bg-white border border-slate-200 p-5 rounded-lg cursor-pointer transition-all text-center flex flex-col items-center gap-3 hover:border-primary hover:bg-blue-50 hover:-translate-y-0.5 hover:shadow" onclick="goToStep2('desligamento', 'Desligamento')">
<span class="type-icon text-3xl">🚫</span>
<span class="type-title font-semibold text-slate-800 text-sm">Desligamento</span>
</div>
<div class="type-card bg-white border border-slate-200 p-5 rounded-lg cursor-pointer transition-all text-center flex flex-col items-center gap-3 hover:border-primary hover:bg-blue-50 hover:-translate-y-0.5 hover:shadow" onclick="goToStep2('movimentacao', 'Movimentação Interna')">
<span class="type-icon text-3xl">🔄</span>
<span class="type-title font-semibold text-slate-800 text-sm">Movimentação</span>
</div>
<div class="type-card bg-white border border-slate-200 p-5 rounded-lg cursor-pointer transition-all text-center flex flex-col items-center gap-3 hover:border-primary hover:bg-blue-50 hover:-translate-y-0.5 hover:shadow" onclick="goToStep2('aumento-quadro', 'Aumento de Quadro')">
<span class="type-icon text-3xl">📈</span>
<span class="type-title font-semibold text-slate-800 text-sm">Aumento de Quadro</span>
</div>
<div class="type-card bg-white border border-slate-200 p-5 rounded-lg cursor-pointer transition-all text-center flex flex-col items-center gap-3 hover:border-primary hover:bg-blue-50 hover:-translate-y-0.5 hover:shadow" onclick="goToStep2('substituicao', 'Substituição')">
<span class="type-icon text-3xl">👥</span>
<span class="type-title font-semibold text-slate-800 text-sm">Substituição</span>
</div>
</div>
</div>
<div id="step2" class="wizard-step">
<div class="back-link text-slate-500 cursor-pointer text-sm mb-5 inline-flex items-center gap-1 font-medium hover:text-primary" onclick="backToStep1()">
<span></span> Voltar para seleção
</div>
<p class="mb-4 text-slate-800">Selecione o colaborador para o processo de <strong id="selectedTypeLabel"></strong>:</p>
<div class="search-container flex flex-col gap-4">
<div class="search-input-group flex gap-3 relative">
<span class="search-icon-fake absolute left-3.5 top-1/2 -translate-y-1/2 text-slate-400 pointer-events-none">🔍</span>
<input type="text" id="wizardSearchInput" class="search-input flex-1 py-3 pl-10 pr-4 border border-slate-200 rounded-lg text-sm font-sans transition-colors focus:outline-none focus:border-primary focus:ring-2 focus:ring-primary/20" placeholder="Busque por Nome ou Matrícula..." onkeydown="if(event.key==='Enter') doSearch()">
<button type="button" class="btn-search bg-primary text-white border-none py-0 px-6 rounded-lg font-medium cursor-pointer transition-colors hover:bg-primary-hover" onclick="doSearch()">Buscar</button>
</div>
<div id="loading" class="loading-spinner text-center text-slate-500 py-8 hidden text-sm">
Consultando base de dados...
</div>
<div id="searchResults" class="results-list flex flex-col gap-2.5 mt-2 max-h-[400px] overflow-y-auto">
</div>
</div>
</div>
</div>
</div>
</div>
<script>
function toggleSidebarDesktop() {
const sidebar = document.getElementById('sidebar');
const btn = sidebar.querySelector('.toggle-btn span');
sidebar.classList.toggle('collapsed');
btn.innerHTML = sidebar.classList.contains('collapsed') ? '»' : '«';
}
function toggleSidebarMobile() {
document.getElementById('sidebar').classList.toggle('active');
}
let currentTypeSlug = '';
function openWizard() {
const overlay = document.getElementById('createWizard');
overlay.style.display = 'flex';
setTimeout(() => overlay.classList.add('show'), 10);
backToStep1();
}
function closeWizard() {
const overlay = document.getElementById('createWizard');
overlay.classList.remove('show');
setTimeout(() => { overlay.style.display = 'none'; }, 200);
}
document.getElementById('createWizard').addEventListener('click', function(e) { if (e.target === this) closeWizard(); });
document.addEventListener('keydown', function(e) { if (e.key === 'Escape') closeWizard(); });
function goToStep2(slug, label) {
if (slug === 'aumento-quadro') {
window.location.href = "{% url 'solicitacoes:criar_admissao_aumento_quadro' %}";
return;
}
currentTypeSlug = slug;
document.getElementById('selectedTypeLabel').textContent = label;
document.getElementById('step1').classList.remove('active');
document.getElementById('step2').classList.add('active');
document.getElementById('wizardSearchInput').value = '';
document.getElementById('searchResults').innerHTML = '';
setTimeout(() => document.getElementById('wizardSearchInput').focus(), 100);
}
function backToStep1() {
document.getElementById('step2').classList.remove('active');
document.getElementById('step1').classList.add('active');
}
async function doSearch() {
const term = document.getElementById('wizardSearchInput').value.trim();
const resultsDiv = document.getElementById('searchResults');
const loader = document.getElementById('loading');
if (!term) return;
resultsDiv.innerHTML = '';
loader.style.display = 'block';
try {
let url = "{% url 'solicitacoes:listar_colaboradores' %}?q=" + encodeURIComponent(term);
if (currentTypeSlug === 'substituicao') url += "&tipo=substituicao";
const response = await fetch(url);
const doc = new DOMParser().parseFromString(await response.text(), 'text/html');
const rows = doc.querySelectorAll('table tbody tr');
if (rows.length === 0) {
resultsDiv.innerHTML = '<div class="text-center py-5 text-slate-500">Nenhum colaborador encontrado.</div>';
} else {
const linkTextMap = { 'desligamento': 'Desligamento', 'movimentacao': 'Movimentação', 'substituicao': 'Substituição' };
rows.forEach(row => {
const cells = row.querySelectorAll('td');
if (cells.length < 6) return;
const matricula = cells[0].textContent.trim(), nome = cells[1].textContent.trim(), cargo = cells[2].textContent.trim();
const linkText = linkTextMap[currentTypeSlug];
const actionLink = linkText ? Array.from(row.querySelectorAll('a')).find(l => l.textContent.includes(linkText)) : null;
if (!actionLink) return;
const href = actionLink.getAttribute('href');
const card = document.createElement('div');
card.className = 'result-item flex justify-between items-center p-4 bg-white border border-slate-200 rounded-lg transition-all hover:border-primary hover:bg-slate-50 hover:shadow';
card.innerHTML = '<div class="result-info flex flex-col gap-1"><span class="result-name font-semibold text-slate-800 text-sm">' + nome + '</span><span class="result-meta text-xs text-slate-500">Matrícula: ' + matricula + ' | ' + cargo + '</span></div><a href="' + href + '" class="btn-select bg-white text-primary border border-slate-200 py-2 px-4 rounded-md text-sm font-semibold no-underline transition-all hover:bg-primary hover:text-white hover:border-primary">Selecionar</a>';
resultsDiv.appendChild(card);
});
}
} catch (err) {
console.error(err);
resultsDiv.innerHTML = '<div class="text-red-600 text-center">Erro ao buscar. Tente novamente.</div>';
} finally {
loader.style.display = 'none';
}
}
</script>
{% block scripts %}{% endblock %}
</body>
</html>

View File

@ -0,0 +1,514 @@
{% load static %}
<!DOCTYPE html>
<html lang="pt-br">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{% block title %}SGMP - Gestão de Pessoas{% endblock %}</title>
<!-- Favicon -->
<link rel="icon" type="image/svg+xml" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><text y='.9em' font-size='90'>📊</text></svg>">
<!-- FONTES -->
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap" rel="stylesheet">
<style>
:root {
--primary-color: #2563eb;
--primary-hover: #1d4ed8;
--bg-color: #f1f5f9;
--sidebar-bg: #0f172a;
--text-main: #334155;
--text-light: #64748b;
--border-color: #e2e8f0;
--card-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);
--success-color: #10b981;
--danger-color: #ef4444;
--warning-color: #f59e0b;
}
* { box-sizing: border-box; }
body {
font-family: "Inter", sans-serif;
background: var(--bg-color);
margin: 0;
padding: 0;
color: var(--text-main);
height: 100vh;
overflow: hidden;
-webkit-font-smoothing: antialiased;
}
/* --- LAYOUT GERAL --- */
.wrapper { display: flex; width: 100%; height: 100vh; }
/* --- SIDEBAR --- */
.sidebar {
background: var(--sidebar-bg); color: #fff; width: 260px; flex-shrink: 0;
display: flex; flex-direction: column; transition: width 0.3s cubic-bezier(0.4, 0, 0.2, 1);
position: relative; z-index: 50; border-right: 1px solid #1e293b;
}
.sidebar.collapsed { width: 72px; }
.sidebar-header {
height: 64px; display: flex; align-items: center; justify-content: space-between;
padding: 0 20px; border-bottom: 1px solid #1e293b;
}
.sidebar.collapsed .sidebar-header { justify-content: center; padding: 0; }
.brand { font-size: 1.1rem; font-weight: 700; letter-spacing: -0.5px; color: #fff; white-space: nowrap; overflow: hidden; }
.sidebar.collapsed .brand { display: none; }
.toggle-btn {
background: transparent; border: none; color: #94a3b8; cursor: pointer; font-size: 1.2rem;
display: flex; align-items: center; justify-content: center; padding: 5px; border-radius: 4px; transition: color 0.2s;
}
.toggle-btn:hover { color: #fff; background: #1e293b; }
.nav-links { padding: 20px 12px; display: flex; flex-direction: column; gap: 6px; flex-grow: 1; overflow-y: auto; }
.nav-item {
color: #94a3b8; font-size: 0.9rem; font-weight: 500; text-decoration: none;
display: flex; align-items: center; padding: 10px 12px; border-radius: 6px;
transition: all 0.2s ease; border: none; background: transparent; width: 100%; cursor: pointer; font-family: inherit;
}
.nav-item:hover { color: #fff; background: #1e293b; }
.nav-item.active { color: #fff; background: var(--primary-color); }
.sidebar.collapsed .nav-item { justify-content: center; padding: 10px 0; }
.link-icon { font-size: 1.1rem; min-width: 24px; display: flex; align-items: center; justify-content: center; }
.link-text { margin-left: 12px; white-space: nowrap; overflow: hidden; opacity: 1; transition: opacity 0.2s; }
.sidebar.collapsed .link-text { opacity: 0; width: 0; display: none; }
.user-section { padding: 16px; background: #0b1120; border-top: 1px solid #1e293b; }
.user-profile { display: flex; align-items: center; gap: 12px; color: #fff; text-decoration: none; overflow: hidden; }
.avatar {
width: 32px; height: 32px; background: var(--primary-color); border-radius: 50%;
display: flex; align-items: center; justify-content: center; font-weight: 600; font-size: 0.8rem; flex-shrink: 0;
}
.user-info { display: flex; flex-direction: column; white-space: nowrap; overflow: hidden; }
.user-name { font-size: 0.85rem; font-weight: 600; }
.user-role { font-size: 0.75rem; color: #94a3b8; }
.sidebar.collapsed .user-info { display: none; }
.sidebar.collapsed .user-section { padding: 16px 0; display: flex; justify-content: center; }
/* --- CONTEÚDO PRINCIPAL --- */
.main-content { flex-grow: 1; overflow-y: auto; height: 100vh; background: var(--bg-color); position: relative; }
.container { max-width: 1200px; margin: 0 auto; padding: 2rem; }
/* --- ESTILOS GERAIS DE FORMULÁRIO (PADRÃO DOMÍNIO) ---
Estes estilos serão usados pelos templates filhos para criar o visual segmentado
*/
.page-header-title { font-size: 1.5rem; font-weight: 700; color: #1e293b; margin-bottom: 1.5rem; display: flex; align-items: center; gap: 10px; }
/* Card de Domínio (Seção) */
.domain-section {
background: white;
border: 1px solid #e2e8f0;
border-radius: 10px;
margin-bottom: 24px;
overflow: hidden;
box-shadow: 0 1px 2px rgba(0,0,0,0.05);
}
.domain-header {
background: #f8fafc;
padding: 16px 24px;
border-bottom: 1px solid #e2e8f0;
display: flex;
align-items: center;
gap: 12px;
}
.domain-header h3 { margin: 0; font-size: 0.95rem; font-weight: 600; color: #475569; text-transform: uppercase; letter-spacing: 0.05em; }
.domain-icon { color: var(--primary-color); font-size: 1.1rem; }
.domain-body { padding: 24px; }
/* Grid para Inputs */
.form-grid { display: grid; grid-template-columns: 1fr; gap: 20px; }
@media (min-width: 768px) { .form-grid { grid-template-columns: repeat(2, 1fr); } }
.full-width { grid-column: 1 / -1; }
/* Inputs Padrão */
.form-control-std {
width: 100%; padding: 10px 12px; border: 1px solid #e2e8f0; border-radius: 6px;
font-size: 0.95rem; font-family: inherit; transition: border-color 0.2s; background: #fff;
}
.form-control-std:focus { outline: none; border-color: var(--primary-color); box-shadow: 0 0 0 3px rgba(37,99,235,0.1); }
.label-std { display: block; margin-bottom: 6px; font-size: 0.9rem; font-weight: 500; color: #334155; }
/* Botões de Ação */
.form-actions { margin-top: 30px; display: flex; gap: 15px; border-top: 1px solid #e2e8f0; padding-top: 20px; }
.btn-std { padding: 12px 24px; border-radius: 8px; font-weight: 500; cursor: pointer; text-decoration: none; display: inline-flex; align-items: center; justify-content: center; gap: 8px; font-size: 0.95rem; border: none; transition: background 0.2s; }
.btn-primary { background: var(--primary-color); color: white; }
.btn-primary:hover { background: var(--primary-hover); }
.btn-secondary { background: white; color: #475569; border: 1px solid #cbd5e1; }
.btn-secondary:hover { background: #f1f5f9; color: #1e293b; }
.btn-danger { background: var(--danger-color); color: white; }
.btn-danger:hover { background: #dc2626; }
/* --- MODAL WIZARD --- */
.wizard-overlay {
position: fixed; inset: 0; background: rgba(15, 23, 42, 0.6); z-index: 1000;
display: none; align-items: center; justify-content: center; backdrop-filter: blur(4px);
opacity: 0; transition: opacity 0.2s ease-in-out;
}
.wizard-overlay.show { opacity: 1; }
.wizard-box {
background: white; width: 100%; max-width: 640px; border-radius: 12px;
box-shadow: 0 25px 50px -12px rgb(0 0 0 / 0.25); overflow: hidden;
display: flex; flex-direction: column; max-height: 85vh;
transform: scale(0.95); transition: transform 0.2s ease-in-out;
}
.wizard-overlay.show .wizard-box { transform: scale(1); }
.wizard-header { padding: 20px 24px; border-bottom: 1px solid var(--border-color); display: flex; justify-content: space-between; align-items: center; background: #fff; }
.wizard-header h3 { margin: 0; font-size: 1.1rem; font-weight: 600; color: var(--text-main); }
.close-wizard { background: transparent; border: none; font-size: 1.5rem; color: var(--text-light); cursor: pointer; width: 32px; height: 32px; border-radius: 6px; display: flex; align-items: center; justify-content: center; transition: background 0.2s; }
.close-wizard:hover { background: #f1f5f9; color: var(--text-main); }
.wizard-body { padding: 24px; overflow-y: auto; background: #fff; }
.type-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: 16px; }
.type-card {
background: #fff; border: 1px solid var(--border-color); padding: 20px; border-radius: 10px;
cursor: pointer; transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1); text-align: center;
display: flex; flex-direction: column; align-items: center; gap: 12px;
}
.type-card:hover { border-color: var(--primary-color); background: #eff6ff; transform: translateY(-2px); box-shadow: var(--card-shadow); }
.type-icon { font-size: 2rem; }
.type-title { font-weight: 600; color: var(--text-main); font-size: 0.95rem; }
/* Busca no Wizard */
.back-link { color: var(--text-light); cursor: pointer; font-size: 0.85rem; margin-bottom: 20px; display: inline-flex; align-items: center; gap: 4px; font-weight: 500; }
.back-link:hover { color: var(--primary-color); }
.search-container { display: flex; flex-direction: column; gap: 16px; }
.search-input-group { display: flex; gap: 12px; position: relative; }
.search-input { flex: 1; padding: 12px 16px; padding-left: 40px; border: 1px solid var(--border-color); border-radius: 8px; font-size: 0.95rem; font-family: inherit; transition: border-color 0.2s, box-shadow 0.2s; }
.search-input:focus { outline: none; border-color: var(--primary-color); box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.1); }
.search-icon-fake { position: absolute; left: 14px; top: 50%; transform: translateY(-50%); color: #94a3b8; pointer-events: none; }
.btn-search { background: var(--primary-color); color: white; border: none; padding: 0 24px; border-radius: 8px; font-weight: 500; cursor: pointer; transition: background 0.2s; }
.btn-search:hover { background: var(--primary-hover); }
.results-list { margin-top: 10px; display: flex; flex-direction: column; gap: 10px; max-height: 400px; overflow-y: auto; }
.result-item { display: flex; justify-content: space-between; align-items: center; padding: 16px; background: #fff; border: 1px solid var(--border-color); border-radius: 8px; transition: all 0.2s; }
.result-item:hover { border-color: var(--primary-color); background: #f8fafc; box-shadow: var(--card-shadow); }
.result-info { display: flex; flex-direction: column; gap: 4px; }
.result-name { font-weight: 600; color: var(--text-main); font-size: 0.95rem; }
.result-meta { font-size: 0.8rem; color: var(--text-light); }
.btn-select { background: white; color: var(--primary-color); border: 1px solid var(--border-color); padding: 8px 16px; border-radius: 6px; font-size: 0.85rem; font-weight: 600; cursor: pointer; text-decoration: none; transition: all 0.2s; }
.btn-select:hover { background: var(--primary-color); color: white; border-color: var(--primary-color); }
.loading-spinner { text-align: center; color: var(--text-light); padding: 30px; display: none; font-size: 0.9rem; }
.wizard-step { display: none; animation: fadeIn 0.3s ease; }
.wizard-step.active { display: block; }
@keyframes fadeIn { from { opacity: 0; transform: translateY(5px); } to { opacity: 1; transform: translateY(0); } }
/* --- RESPONSIVIDADE --- */
@media (max-width: 768px) {
.sidebar { position: absolute; height: 100%; width: 260px; transform: translateX(-100%); }
.sidebar.active { transform: translateX(0); }
.sidebar.collapsed { width: 260px; transform: translateX(-100%); } /* Reseta no mobile */
.main-content { padding: 0; }
.container { padding: 1.5rem; }
.mobile-menu-btn { display: block !important; position: absolute; top: 15px; left: 15px; z-index: 40; background: white; border: 1px solid #e2e8f0; border-radius: 6px; padding: 8px; box-shadow: 0 2px 5px rgba(0,0,0,0.1); }
.sidebar-overlay { display: none; position: fixed; inset: 0; background: rgba(0,0,0,0.5); z-index: 45; backdrop-filter: blur(2px); }
.sidebar.active + .sidebar-overlay { display: block; }
}
.mobile-menu-btn { display: none; }
</style>
{% block css %}{% endblock %}
</head>
<body>
<div class="wrapper">
<!-- Overlay mobile -->
<button class="mobile-menu-btn" onclick="toggleSidebarMobile()">
<span style="font-size: 1.2rem;"></span>
</button>
<!-- SIDEBAR -->
<nav class="sidebar" id="sidebar">
<div class="sidebar-header">
<div class="brand">SGMP <span>CORP</span></div>
<button class="toggle-btn" onclick="toggleSidebarDesktop()" title="Recolher Menu">
<span>«</span>
</button>
</div>
<div class="nav-links">
<a href="{% url 'solicitacoes:dashboard' %}" class="nav-item" title="Dashboard">
<span class="link-icon">📊</span>
<span class="link-text">Dashboard</span>
</a>
{# Menu de "Todas as Solicitações" - visível para qualquer perfil autenticado, exceto Gestor #}
{% if user.is_authenticated and usuario_sistema and usuario_sistema.perfil != 'GESTOR' %}
<a href="{% url 'solicitacoes:todas_solicitacoes' %}" class="nav-item" title="Todas as solicitações">
<span class="link-icon">📑</span>
<span class="link-text">Todas as solicitações</span>
</a>
{% endif %}
{% if user.is_authenticated and usuario_sistema and usuario_sistema.perfil == 'GESTOR' %}
<button onclick="openWizard()" class="nav-item" title="Criar Solicitação">
<span class="link-icon"></span>
<span class="link-text">Nova Solicitação</span>
</button>
{% endif %}
{% comment %} <a href="{% url 'solicitacoes:gerenciar_permissoes' %}" class="nav-item" title="Gerenciar Permissões">
<span class="link-icon">⚙️</span>
<span class="link-text">Administração</span>
</a> {% endcomment %}
</div>
{% if user.is_authenticated %}
<div class="user-section">
<a href="{% url 'solicitacoes:logout' %}" class="user-profile" title="Sair">
<div class="avatar">
{% if usuario_sistema %}
{{ usuario_sistema.nome|make_list|first }}
{% else %}
{{ user.username|make_list|first }}
{% endif %}
</div>
<div class="user-info">
<span class="user-name">
{% if usuario_sistema %}{{ usuario_sistema.nome }}{% else %}{{ user.username }}{% endif %}
</span>
<span class="user-role">
{% if usuario_sistema %}{{ usuario_sistema.get_perfil_display }}{% else %}Usuário{% endif %}
</span>
</div>
<span class="link-icon" style="margin-left: auto; color: #ef4444;" title="Sair">🚪</span>
</a>
</div>
{% endif %}
</nav>
<div class="sidebar-overlay" onclick="toggleSidebarMobile()"></div>
<!-- CONTEÚDO PRINCIPAL -->
<main class="main-content">
<div class="container">
{% block content %}{% endblock %}
</div>
</main>
</div>
<!-- ======================= -->
<!-- MODAL WIZARD DE CRIAÇÃO -->
<!-- ======================= -->
<div id="createWizard" class="wizard-overlay">
<div class="wizard-box">
<div class="wizard-header">
<h3 id="wizardTitle">Iniciar Novo Processo</h3>
<button class="close-wizard" onclick="closeWizard()">×</button>
</div>
<div class="wizard-body">
<!-- PASSO 1: Selecionar Tipo -->
<div id="step1" class="wizard-step active">
<p class="wizard-intro">Qual tipo de movimentação você deseja realizar hoje?</p>
<div class="type-grid">
<div class="type-card" onclick="goToStep2('desligamento', 'Desligamento')">
<span class="type-icon">🚫</span>
<span class="type-title">Desligamento</span>
</div>
<div class="type-card" onclick="goToStep2('movimentacao', 'Movimentação Interna')">
<span class="type-icon">🔄</span>
<span class="type-title">Movimentação</span>
</div>
<div class="type-card" onclick="goToStep2('aumento-quadro', 'Aumento de Quadro')">
<span class="type-icon">📈</span>
<span class="type-title">Aumento de Quadro</span>
</div>
<div class="type-card" onclick="goToStep2('substituicao', 'Substituição')">
<span class="type-icon">👥</span>
<span class="type-title">Substituição</span>
</div>
</div>
</div>
<!-- PASSO 2: Buscar Colaborador -->
<div id="step2" class="wizard-step">
<div class="back-link" onclick="backToStep1()">
<span></span> Voltar para seleção
</div>
<p style="margin-bottom: 15px; color: var(--text-main);">Selecione o colaborador para o processo de <strong id="selectedTypeLabel"></strong>:</p>
<div class="search-container">
<div class="search-input-group">
<span class="search-icon-fake">🔍</span>
<input type="text" id="wizardSearchInput" class="search-input" placeholder="Busque por Nome ou Matrícula..." onkeydown="if(event.key==='Enter') doSearch()">
<button class="btn-search" onclick="doSearch()">Buscar</button>
</div>
<div id="loading" class="loading-spinner">
Consultando base de dados...
</div>
<div id="searchResults" class="results-list">
<!-- Resultados injetados via JS -->
</div>
</div>
</div>
</div>
</div>
</div>
<script>
// --- LÓGICA DA SIDEBAR ---
function toggleSidebarDesktop() {
const sidebar = document.getElementById('sidebar');
const btn = sidebar.querySelector('.toggle-btn span');
sidebar.classList.toggle('collapsed');
// Troca icone da seta
if(sidebar.classList.contains('collapsed')) {
btn.innerHTML = '»';
} else {
btn.innerHTML = '«';
}
}
function toggleSidebarMobile() {
const sidebar = document.getElementById('sidebar');
sidebar.classList.toggle('active');
}
// --- VARIÁVEIS DE ESTADO ---
let currentTypeSlug = '';
// --- CONTROLE DO MODAL ---
function openWizard() {
const overlay = document.getElementById('createWizard');
overlay.style.display = 'flex';
// Pequeno timeout para ativar a transição de opacidade
setTimeout(() => overlay.classList.add('show'), 10);
backToStep1();
}
function closeWizard() {
const overlay = document.getElementById('createWizard');
overlay.classList.remove('show');
setTimeout(() => {
overlay.style.display = 'none';
}, 200); // Espera animação CSS
}
// Fechar com ESC ou clicando fora
document.getElementById('createWizard').addEventListener('click', function(e) {
if (e.target === this) closeWizard();
});
document.addEventListener('keydown', function(e) {
if (e.key === 'Escape') closeWizard();
});
function goToStep2(slug, label) {
if (slug === 'aumento-quadro') {
window.location.href = "{% url 'solicitacoes:criar_admissao_aumento_quadro' %}";
return;
}
currentTypeSlug = slug;
document.getElementById('selectedTypeLabel').textContent = label;
document.getElementById('step1').classList.remove('active');
document.getElementById('step2').classList.add('active');
document.getElementById('wizardSearchInput').value = '';
document.getElementById('searchResults').innerHTML = '';
setTimeout(() => document.getElementById('wizardSearchInput').focus(), 100);
}
function backToStep1() {
document.getElementById('step2').classList.remove('active');
document.getElementById('step1').classList.add('active');
}
// --- LÓGICA DE BUSCA ---
async function doSearch() {
const term = document.getElementById('wizardSearchInput').value.trim();
const resultsDiv = document.getElementById('searchResults');
const loader = document.getElementById('loading');
if (!term) return;
resultsDiv.innerHTML = '';
loader.style.display = 'block';
try {
let url = "{% url 'solicitacoes:listar_colaboradores' %}?q=" + encodeURIComponent(term);
if (currentTypeSlug === 'substituicao') {
url += "&tipo=substituicao";
}
const response = await fetch(url);
const htmlText = await response.text();
const parser = new DOMParser();
const doc = parser.parseFromString(htmlText, 'text/html');
const rows = doc.querySelectorAll('table tbody tr');
if (rows.length === 0) {
resultsDiv.innerHTML = '<div style="text-align:center; padding:20px; color:#64748b">Nenhum colaborador encontrado.</div>';
} else {
rows.forEach(row => {
const cells = row.querySelectorAll('td');
if (cells.length < 6) return;
const matricula = cells[0].textContent.trim();
const nome = cells[1].textContent.trim();
const cargo = cells[2].textContent.trim();
let actionLink = null;
const links = row.querySelectorAll('a');
const linkTextMap = {
'desligamento': 'Desligamento',
'movimentacao': 'Movimentação',
'substituicao': 'Substituição'
};
const linkText = linkTextMap[currentTypeSlug];
if (linkText) {
actionLink = Array.from(links).find(l => l.textContent.includes(linkText));
}
if (!actionLink) return;
const href = actionLink.getAttribute('href');
const card = document.createElement('div');
card.className = 'result-item';
card.innerHTML = `
<div class="result-info">
<span class="result-name">${nome}</span>
<span class="result-meta">Matrícula: ${matricula} | ${cargo}</span>
</div>
<a href="${href}" class="btn-select">Selecionar</a>
`;
resultsDiv.appendChild(card);
});
}
} catch (error) {
console.error(error);
resultsDiv.innerHTML = '<div style="color:red; text-align:center">Erro ao buscar. Tente novamente.</div>';
} finally {
loader.style.display = 'none';
}
}
</script>
{% block scripts %}{% endblock %}
</body>
</html>

454
templates/dashboard.html Normal file
View File

@ -0,0 +1,454 @@
{% extends "base.html" %}
{% block title %}Dashboard - SGMP{% endblock %}
{% block css %}
<style>
.tab-pane { display: none; }
.tab-pane.active { display: block; }
.tab-btn.active { color: #2563eb; border-bottom-color: #2563eb; font-weight: 600; }
.details-row td { padding: 0 !important; border-bottom: none; }
.request-row.expanded .chevron-icon { transform: rotate(180deg); }
.metric-card.active { background-color: #f8fafc; border-color: #cbd5e1; transform: scale(1.02); box-shadow: 0 4px 6px -1px rgba(0,0,0,0.1); }
.status-RASCUNHO { background: #fffbeb; color: #b45309; border: 1px solid #fcd34d; }
.status-AGUARDANDO_HEAD { background: #fef3c7; color: #b45309; border: 1px solid #fcd34d; }
.status-ENVIADA { background: #eff6ff; color: #1d4ed8; border: 1px solid #bfdbfe; }
.status-APROVADA_GG, .status-APROVADA_CONTROLADORIA, .status-APROVADA_DIRETORIA { background: #ecfdf5; color: #047857; border: 1px solid #6ee7b7; }
.status-FINALIZADA { background: #f3f4f6; color: #374151; border: 1px solid #d1d5db; }
.status-REPROVADA { background: #fef2f2; color: #b91c1c; border: 1px solid #fecaca; }
</style>
{% endblock %}
{% block content %}
<div class="dashboard-header mb-8 flex flex-col gap-2">
<h1 class="text-2xl md:text-3xl font-bold text-slate-800 m-0 tracking-tight">SGMP - Movimentação de Pessoas</h1>
<p class="text-slate-500 text-sm md:text-base leading-relaxed m-0">
Olá, <strong>{{ usuario_sistema.nome }}</strong>!
<span class="inline-block bg-slate-200 py-0.5 px-2 rounded text-xs ml-2 text-slate-600">{{ usuario_sistema.get_perfil_display }}</span>
<br>
<small class="text-slate-400">Matrícula: {{ usuario_sistema.matricula }}</small>
</p>
</div>
{% if messages %}
<ul class="list-none p-0 m-0 mb-5">
{% for message in messages %}
<li class="py-3.5 px-4 mb-3 rounded-lg border text-sm flex items-center
{% if message.tags == 'error' %}bg-red-50 text-red-800 border-red-200
{% elif message.tags == 'success' %}bg-green-50 text-green-800 border-green-200
{% else %}bg-blue-50 text-blue-800 border-blue-200{% endif %}">
{% if message.tags == 'error' %}⚠️{% elif message.tags == 'success' %}✅{% else %}{% endif %}
&nbsp;{{ message }}
</li>
{% endfor %}
</ul>
{% endif %}
{% if usuario_sistema.perfil == 'GESTOR' %}
<div class="mb-8">
<div class="bg-amber-50 border border-amber-300 rounded-xl p-4 mb-6 flex gap-3 items-start">
<span class="text-2xl">💡</span>
<div>
<h4 class="m-0 mb-1 text-amber-800 font-semibold">Lembrete Rápido</h4>
<p class="m-0 text-amber-700 text-sm">
Solicitações em <strong>Rascunho</strong> só são visíveis para você.
Lembre-se de clicar em <strong>"Enviar para Aprovação"</strong> na página de detalhes para iniciar o fluxo.
</p>
</div>
</div>
</div>
{% endif %}
<div class="metrics-grid grid grid-cols-2 md:grid-cols-[repeat(auto-fit,minmax(220px,1fr))] gap-4 md:gap-6 mb-10">
<div class="metric-card bg-white p-6 rounded-xl border border-slate-200 shadow-sm border-l-4 border-l-blue-500 cursor-pointer transition-all hover:-translate-y-1 hover:shadow-md active" onclick="filtrarTabela('todos', this)">
<div class="metric-label text-xs uppercase tracking-wider text-slate-500 font-bold mb-2">Total</div>
<div class="metric-value text-3xl font-extrabold leading-none text-blue-500">{{ total }}</div>
</div>
<div class="metric-card bg-white p-6 rounded-xl border border-slate-200 shadow-sm border-l-4 border-l-amber-500 cursor-pointer transition-all hover:-translate-y-1 hover:shadow-md" onclick="filtrarTabela('pendente', this)">
<div class="metric-label text-xs uppercase tracking-wider text-slate-500 font-bold mb-2">Pendentes</div>
<div class="metric-value text-3xl font-extrabold leading-none text-amber-600">{{ pendentes }}</div>
</div>
</div>
<div class="section mb-8">
<h3 class="text-slate-800 text-xl font-semibold mb-4 flex items-center gap-2">
{% if usuario_sistema.perfil == 'GESTOR' %}📋 Minhas Solicitações{% else %}⏳ Pendentes de Aprovação{% endif %}
</h3>
{% if usuario_sistema.perfil != 'GESTOR' %}
<div class="bg-blue-50 border border-blue-200 rounded-lg py-3 px-4 mb-5 text-blue-800 text-sm flex items-center gap-2">
Você está vendo solicitações com status <strong>Enviada</strong> aguardando sua análise.
</div>
{% endif %}
{% if solicitacoes %}
<div class="table-responsive w-full overflow-x-auto bg-white rounded-xl shadow border border-slate-200">
<table id="tabela-solicitacoes" class="w-full border-collapse whitespace-nowrap">
<thead>
<tr>
<th class="p-4 text-left border-b border-slate-200 bg-slate-50 font-semibold text-slate-600 text-xs uppercase tracking-wide">Tipo</th>
<th class="p-4 text-left border-b border-slate-200 bg-slate-50 font-semibold text-slate-600 text-xs uppercase tracking-wide">Colaborador</th>
<th class="p-4 text-left border-b border-slate-200 bg-slate-50 font-semibold text-slate-600 text-xs uppercase tracking-wide">Status</th>
<th class="p-4 text-left border-b border-slate-200 bg-slate-50 font-semibold text-slate-600 text-xs uppercase tracking-wide">Data</th>
<th class="p-4 text-left border-b border-slate-200 bg-slate-50 font-semibold text-slate-600 text-xs uppercase tracking-wide">Ações</th>
</tr>
</thead>
<tbody>
{% for item in solicitacoes_com_acao %}
{% with solicitacao=item.solicitacao %}
<tr class="request-row border-b border-slate-200 hover:bg-slate-50 cursor-pointer"
data-id="{{ solicitacao.id }}"
data-status="{% if solicitacao.status == 'FINALIZADA' %}aprovado{% elif solicitacao.status == 'REPROVADA' %}reprovado{% else %}pendente{% endif %}"
onclick="toggleDetails('{{ solicitacao.id }}', this)">
<td class="p-4"><strong>{{ solicitacao.get_tipo_display }}</strong></td>
<td class="p-4">
{% if solicitacao.funcionario %}{{ solicitacao.funcionario.nome }}{% else %}<span class="text-slate-400">N/A</span>{% endif %}
</td>
<td class="p-4">
<span class="status-badge inline-flex items-center py-1 px-2.5 rounded-full text-xs font-bold status-{{ solicitacao.status }}">{{ solicitacao.get_status_display }}</span>
</td>
<td class="p-4 text-slate-500">{{ solicitacao.criado_em|date:"d/m/Y H:i" }}</td>
<td class="p-4">
<div class="flex gap-3 items-center">
<span class="expand-btn text-blue-600 font-semibold text-sm">Detalhes <span class="chevron-icon inline-block text-xs transition-transform"></span></span>
{% if item.pode_dar_parecer %}
<a href="{% url 'solicitacoes:solicitacao_detalhe' solicitacao.id %}" class="btn-action btn-action-primary inline-flex items-center gap-1.5 py-2.5 px-4 rounded-md text-sm font-semibold bg-primary text-white border border-primary-hover hover:bg-primary-hover no-underline" title="Fornecer parecer técnico">📝 Parecer</a>
{% endif %}
{% if item.pode_aprovar %}
<div class="flex gap-1">
<button type="button" class="btn-action btn-action-success py-1 px-2 text-sm bg-emerald-500 text-white border border-emerald-600 rounded hover:bg-emerald-600" onclick="event.stopPropagation(); abrirModalAprovacao('{{ solicitacao.id }}', 'APROVADO')" title="Aprovar"></button>
<button type="button" class="btn-action btn-action-danger py-1 px-2 text-sm bg-white text-red-500 border border-red-500 rounded hover:bg-red-50" onclick="event.stopPropagation(); abrirModalAprovacao('{{ solicitacao.id }}', 'REPROVADO')" title="Reprovar"></button>
</div>
{% endif %}
</div>
</td>
</tr>
<tr id="details-{{ solicitacao.id }}" class="details-row bg-slate-50" style="display:none;">
<td colspan="5">
<div class="details-wrapper p-8" id="wrapper-{{ solicitacao.id }}">
<div class="tab-nav flex border-b border-slate-200 mb-6 gap-8 overflow-x-auto">
<button type="button" class="tab-btn active pb-3 border-b-2 border-transparent text-slate-500 text-sm font-medium whitespace-nowrap hover:text-primary border-b-primary text-primary font-semibold" onclick="switchTab(event, 'solicitacao', '{{ solicitacao.id }}')">📄 Solicitação</button>
{% if solicitacao.funcionario %}
<button type="button" class="tab-btn pb-3 border-b-2 border-transparent text-slate-500 text-sm font-medium whitespace-nowrap hover:text-primary" onclick="switchTab(event, 'rm', '{{ solicitacao.id }}')">🏢 RM (Totvs)</button>
{% endif %}
{% for item_acao in solicitacoes_com_acao %}
{% if item_acao.solicitacao.id == solicitacao.id and item_acao.dados_winthor_organizados %}
<button type="button" class="tab-btn pb-3 border-b-2 border-transparent text-slate-500 text-sm font-medium whitespace-nowrap hover:text-primary" onclick="switchTab(event, 'winthor', '{{ solicitacao.id }}')">💼 Winthor</button>
{% endif %}
{% endfor %}
<button type="button" class="tab-btn pb-3 border-b-2 border-transparent text-slate-500 text-sm font-medium whitespace-nowrap hover:text-primary" onclick="switchTab(event, 'auditoria', '{{ solicitacao.id }}')">📝 Histórico & Auditoria</button>
</div>
<div class="tab-pane active" data-tab="solicitacao">
<div class="details-section mb-6 bg-white p-6 rounded-xl border border-slate-200">
<h5 class="text-slate-400 text-xs uppercase mt-6 mb-4 font-bold tracking-wider border-b border-slate-100 pb-2 first:mt-0">Dados Gerais</h5>
<div class="info-grid grid grid-cols-1 md:grid-cols-[repeat(auto-fill,minmax(200px,1fr))] gap-6 mb-6">
<div class="info-item flex flex-col"><label class="text-xs text-slate-500 mb-1 font-semibold uppercase">Solicitante</label><span class="text-slate-900 font-medium">{{ solicitacao.solicitante.nome }} <small class="text-slate-500">({{ solicitacao.solicitante.matricula }})</small></span></div>
<div class="info-item flex flex-col"><label class="text-xs text-slate-500 mb-1 font-semibold uppercase">Tipo</label><span class="font-bold text-primary">{{ solicitacao.get_tipo_display }}</span></div>
<div class="info-item flex flex-col"><label class="text-xs text-slate-500 mb-1 font-semibold uppercase">Data Criação</label><span class="text-slate-900 font-medium">{{ solicitacao.criado_em|date:"d/m/Y H:i" }}</span></div>
{% if solicitacao.enviada_em %}<div class="info-item flex flex-col"><label class="text-xs text-slate-500 mb-1 font-semibold uppercase">Enviada em</label><span class="text-slate-900 font-medium">{{ solicitacao.enviada_em|date:"d/m/Y H:i" }}</span></div>{% endif %}
{% if solicitacao.finalizada_em %}<div class="info-item flex flex-col"><label class="text-xs text-slate-500 mb-1 font-semibold uppercase">Finalizada em</label><span class="text-slate-900 font-medium">{{ solicitacao.finalizada_em|date:"d/m/Y H:i" }}</span></div>{% endif %}
</div>
{% if solicitacao.tipo == 'DESLIGAMENTO' and solicitacao.desligamento %}
<h5 class="text-slate-400 text-xs uppercase mt-6 mb-4 font-bold tracking-wider border-b border-slate-100 pb-2">Detalhes do Desligamento</h5>
<div class="info-grid grid grid-cols-1 md:grid-cols-[repeat(auto-fill,minmax(200px,1fr))] gap-6 mb-6">
{% if solicitacao.desligamento.tipo_desligamento %}
<div class="info-item flex flex-col"><label class="text-xs text-slate-500 mb-1 font-semibold uppercase">Tipo de Desligamento</label><span>{% if solicitacao.desligamento.tipo_desligamento == 'PEDIDO_DEMISSAO' %}📝 Pedido de Demissão{% elif solicitacao.desligamento.tipo_desligamento == 'SEM_JUSTA_CAUSA' %}🚪 Sem Justa Causa{% elif solicitacao.desligamento.tipo_desligamento == 'COM_JUSTA_CAUSA' %}⚠️ Por Justa Causa{% elif solicitacao.desligamento.tipo_desligamento == 'TERMINO_CONTRATO' %}📅 Término de Contrato{% elif solicitacao.desligamento.tipo_desligamento == 'OUTROS' %}📋 Outros{% else %}{{ solicitacao.desligamento.get_tipo_desligamento_display|default:"—" }}{% endif %}</span></div>
{% endif %}
{% if solicitacao.desligamento.aviso_previo %}
<div class="info-item flex flex-col"><label class="text-xs text-slate-500 mb-1 font-semibold uppercase">Aviso Prévio</label><span>{% if solicitacao.desligamento.aviso_previo == 'TRABALHADO' %}✅ Trabalhado{% elif solicitacao.desligamento.aviso_previo == 'INDENIZADO' %}💰 Indenizado{% elif solicitacao.desligamento.aviso_previo == 'DISPENSADO' %}📤 Dispensado{% else %}{{ solicitacao.desligamento.get_aviso_previo_display|default:"—" }}{% endif %}</span></div>
{% endif %}
<div class="info-item flex flex-col"><label class="text-xs text-slate-500 mb-1 font-semibold uppercase">Data Prevista de Saída</label><span>{{ solicitacao.desligamento.data_prevista_desligamento|date:"d/m/Y"|default:"—" }}</span></div>
<div class="info-item flex flex-col md:col-span-full"><label class="text-xs text-slate-500 mb-1 font-semibold uppercase">Detalhamento / Justificativa</label><span class="whitespace-pre-wrap">{{ solicitacao.desligamento.motivo|default:"—" }}</span></div>
{% if solicitacao.desligamento.arquivo_pedido %}<div class="info-item flex flex-col md:col-span-full"><label class="text-xs text-slate-500 mb-1 font-semibold uppercase">Carta de Pedido</label><span><a href="{{ solicitacao.desligamento.arquivo_pedido.url }}" target="_blank" class="text-primary no-underline">📎 Ver arquivo</a></span></div>{% endif %}
{% if solicitacao.desligamento.observacoes %}<div class="info-item flex flex-col md:col-span-full"><label class="text-xs text-slate-500 mb-1 font-semibold uppercase">Observações Adicionais</label><span class="whitespace-pre-wrap">{{ solicitacao.desligamento.observacoes }}</span></div>{% endif %}
</div>
{% elif solicitacao.tipo == 'MOVIMENTACAO' and solicitacao.movimentacao %}
<h5 class="text-slate-400 text-xs uppercase mt-6 mb-4 font-bold tracking-wider border-b border-slate-100 pb-2">Detalhes da Movimentação</h5>
<div class="info-grid grid grid-cols-1 md:grid-cols-[repeat(auto-fill,minmax(200px,1fr))] gap-6 mb-6">
<div class="info-item flex flex-col"><label class="text-xs text-slate-500 mb-1 font-semibold uppercase">Data de Efetivação</label><span>{{ solicitacao.movimentacao.data_efetivacao|date:"d/m/Y"|default:"—" }}</span></div>
{% if solicitacao.movimentacao.altera_funcao %}<div class="info-item flex flex-col"><label class="text-xs text-slate-500 mb-1 font-semibold uppercase">Nova Função</label><span>{{ solicitacao.movimentacao.novo_cod_funcao|default:"—" }}</span></div>{% endif %}
{% if solicitacao.movimentacao.altera_centro_custo %}<div class="info-item flex flex-col"><label class="text-xs text-slate-500 mb-1 font-semibold uppercase">Nova Seção</label><span>{{ solicitacao.movimentacao.novo_cod_secao|default:"—" }}</span></div>{% endif %}
{% if solicitacao.movimentacao.novo_salario %}<div class="info-item flex flex-col"><label class="text-xs text-slate-500 mb-1 font-semibold uppercase">Novo Salário</label><span>R$ {{ solicitacao.movimentacao.novo_salario }}</span></div>{% endif %}
<div class="info-item flex flex-col md:col-span-full"><label class="text-xs text-slate-500 mb-1 font-semibold uppercase">Justificativa</label><span>{{ solicitacao.movimentacao.justificativa|default:"—" }}</span></div>
</div>
{% elif solicitacao.tipo == 'ADM_SUBSTITUICAO' and solicitacao.admissao_substituicao %}
<h5 class="text-slate-400 text-xs uppercase mt-6 mb-4 font-bold tracking-wider border-b border-slate-100 pb-2">Detalhes da Admissão por Substituição</h5>
<div class="info-grid grid grid-cols-1 md:grid-cols-[repeat(auto-fill,minmax(200px,1fr))] gap-6 mb-6">
<div class="info-item flex flex-col"><label class="text-xs text-slate-500 mb-1 font-semibold uppercase">Data Prevista</label><span>{{ solicitacao.admissao_substituicao.data_previsao_contratacao|date:"d/m/Y"|default:"—" }}</span></div>
<div class="info-item flex flex-col"><label class="text-xs text-slate-500 mb-1 font-semibold uppercase">Coligada Destino</label><span>{{ solicitacao.admissao_substituicao.cod_coligada_destino|default:"—" }}</span></div>
<div class="info-item flex flex-col"><label class="text-xs text-slate-500 mb-1 font-semibold uppercase">Filial Destino</label><span>{{ solicitacao.admissao_substituicao.cod_filial_destino|default:"—" }}</span></div>
<div class="info-item flex flex-col"><label class="text-xs text-slate-500 mb-1 font-semibold uppercase">Seção Destino</label><span>{{ solicitacao.admissao_substituicao.cod_secao_destino|default:"—" }}</span></div>
<div class="info-item flex flex-col"><label class="text-xs text-slate-500 mb-1 font-semibold uppercase">Função Destino</label><span>{{ solicitacao.admissao_substituicao.cod_funcao_destino|default:"—" }}</span></div>
<div class="info-item flex flex-col md:col-span-full"><label class="text-xs text-slate-500 mb-1 font-semibold uppercase">Justificativa</label><span>{{ solicitacao.admissao_substituicao.justificativa|default:"—" }}</span></div>
</div>
{% elif solicitacao.tipo == 'ADM_AUMENTO' and solicitacao.admissao_aumento %}
<h5 class="text-slate-400 text-xs uppercase mt-6 mb-4 font-bold tracking-wider border-b border-slate-100 pb-2">Detalhes da Admissão por Aumento de Quadro</h5>
<div class="info-grid grid grid-cols-1 md:grid-cols-[repeat(auto-fill,minmax(200px,1fr))] gap-6 mb-6">
<div class="info-item flex flex-col"><label class="text-xs text-slate-500 mb-1 font-semibold uppercase">Data Prevista</label><span>{{ solicitacao.admissao_aumento.data_previsao_contratacao|date:"d/m/Y"|default:"—" }}</span></div>
<div class="info-item flex flex-col"><label class="text-xs text-slate-500 mb-1 font-semibold uppercase">Coligada Destino</label><span>{{ solicitacao.admissao_aumento.cod_coligada_destino|default:"—" }}</span></div>
<div class="info-item flex flex-col"><label class="text-xs text-slate-500 mb-1 font-semibold uppercase">Filial Destino</label><span>{{ solicitacao.admissao_aumento.cod_filial_destino|default:"—" }}</span></div>
<div class="info-item flex flex-col"><label class="text-xs text-slate-500 mb-1 font-semibold uppercase">Seção Destino</label><span>{{ solicitacao.admissao_aumento.cod_secao_destino|default:"—" }}</span></div>
<div class="info-item flex flex-col"><label class="text-xs text-slate-500 mb-1 font-semibold uppercase">Função Destino</label><span>{{ solicitacao.admissao_aumento.cod_funcao_destino|default:"—" }}</span></div>
<div class="info-item flex flex-col md:col-span-full"><label class="text-xs text-slate-500 mb-1 font-semibold uppercase">Justificativa Estratégica</label><span>{{ solicitacao.admissao_aumento.justificativa_estrategica|default:"—" }}</span></div>
</div>
{% endif %}
<div class="mt-8 pt-6 border-t border-slate-200">
{% if solicitacao.pode_enviar and solicitacao.solicitante.id == usuario_sistema.id %}
<a href="{% url 'solicitacoes:enviar_solicitacao' solicitacao.id %}" class="btn-action btn-action-primary inline-flex items-center gap-1.5 py-2.5 px-4 rounded-md text-sm font-semibold bg-primary text-white border border-primary-hover hover:bg-primary-hover no-underline">🚀 Enviar para Aprovação</a>
{% endif %}
</div>
</div>
</div>
{% if solicitacao.funcionario %}
<div class="tab-pane" data-tab="rm">
<div class="details-section mb-6 bg-white p-6 rounded-xl border-2 border-primary">
<div class="inline-flex items-center gap-2 -mt-4 mb-6 text-primary bg-blue-100 py-2 px-3 rounded-md text-sm font-semibold">💾 Snapshot TOTVS RM</div>
<h5 class="text-slate-400 text-xs uppercase mt-6 mb-4 font-bold tracking-wider border-b border-slate-100 pb-2 first:mt-0">Dados Básicos</h5>
<div class="info-grid grid grid-cols-1 md:grid-cols-[repeat(auto-fill,minmax(200px,1fr))] gap-6 mb-6">
<div class="info-item flex flex-col"><label class="text-xs text-slate-500 mb-1 font-semibold uppercase">Matrícula</label><span><strong>{{ solicitacao.funcionario.matricula }}</strong></span></div>
<div class="info-item flex flex-col"><label class="text-xs text-slate-500 mb-1 font-semibold uppercase">Nome Completo</label><span><strong>{{ solicitacao.funcionario.nome }}</strong></span></div>
{% if solicitacao.funcionario.cpf %}<div class="info-item flex flex-col"><label class="text-xs text-slate-500 mb-1 font-semibold uppercase">CPF</label><span>{{ solicitacao.funcionario.cpf }}</span></div>{% endif %}
{% if solicitacao.funcionario.data_admissao %}<div class="info-item flex flex-col"><label class="text-xs text-slate-500 mb-1 font-semibold uppercase">Data de Admissão</label><span>{{ solicitacao.funcionario.data_admissao|date:"d/m/Y" }}</span></div>{% endif %}
{% if solicitacao.funcionario.situacao %}<div class="info-item flex flex-col"><label class="text-xs text-slate-500 mb-1 font-semibold uppercase">Situação</label><span>{{ solicitacao.funcionario.situacao }}</span></div>{% endif %}
</div>
<h5 class="text-slate-400 text-xs uppercase mt-6 mb-4 font-bold tracking-wider border-b border-slate-100 pb-2">Dados Profissionais</h5>
<div class="info-grid grid grid-cols-1 md:grid-cols-[repeat(auto-fill,minmax(200px,1fr))] gap-6 mb-6">
<div class="info-item flex flex-col"><label class="text-xs text-slate-500 mb-1 font-semibold uppercase">Cargo/Função</label><span>{{ solicitacao.funcionario.cargo }}</span></div>
<div class="info-item flex flex-col"><label class="text-xs text-slate-500 mb-1 font-semibold uppercase">Código da Função</label><span>{{ solicitacao.funcionario.cod_funcao|default:"N/A" }}</span></div>
<div class="info-item flex flex-col"><label class="text-xs text-slate-500 mb-1 font-semibold uppercase">Setor/Seção</label><span>{{ solicitacao.funcionario.setor }}</span></div>
<div class="info-item flex flex-col"><label class="text-xs text-slate-500 mb-1 font-semibold uppercase">Centro de Custo</label><span>{{ solicitacao.funcionario.centro_custo }}</span></div>
{% if solicitacao.funcionario.salario %}<div class="info-item flex flex-col"><label class="text-xs text-slate-500 mb-1 font-semibold uppercase">Salário Atual</label><span><strong class="text-emerald-600 text-lg">R$ {{ solicitacao.funcionario.salario|floatformat:2 }}</strong></span></div>{% endif %}
</div>
{% if solicitacao.funcionario.saldo_banco_horas_minutos is not None %}
<h5 class="text-slate-400 text-xs uppercase mt-6 mb-4 font-bold tracking-wider border-b border-slate-100 pb-2">Banco de Horas</h5>
<div class="info-grid grid grid-cols-1 md:grid-cols-[repeat(auto-fill,minmax(200px,1fr))] gap-6 mb-6">
<div class="info-item flex flex-col"><label class="text-xs text-slate-500 mb-1 font-semibold uppercase">Saldo Atual</label><span>{% if solicitacao.funcionario.saldo_banco_horas_minutos >= 0 %}<strong class="text-emerald-600 text-lg">+{{ solicitacao.funcionario.saldo_banco_horas_minutos }} min</strong>{% else %}<strong class="text-red-500 text-lg">{{ solicitacao.funcionario.saldo_banco_horas_minutos }} min</strong>{% endif %}</span></div>
</div>
{% endif %}
</div>
</div>
{% endif %}
{% for item_acao in solicitacoes_com_acao %}
{% if item_acao.solicitacao.id == solicitacao.id and item_acao.dados_winthor_organizados %}
{% with win=item_acao.dados_winthor_organizados %}
<div class="tab-pane" data-tab="winthor">
<div class="details-section mb-6 bg-white p-6 rounded-xl border-2 border-emerald-500">
<div class="inline-flex items-center gap-2 -mt-4 mb-6 text-emerald-700 bg-emerald-100 py-2 px-3 rounded-md text-sm font-semibold">💼 Sistema Winthor</div>
{% if win.basicos %}
<h5 class="text-slate-400 text-xs uppercase mt-6 mb-4 font-bold tracking-wider border-b border-slate-100 pb-2 first:mt-0">Dados Básicos</h5>
<div class="info-grid grid grid-cols-1 md:grid-cols-[repeat(auto-fill,minmax(200px,1fr))] gap-6 mb-6">
{% if win.basicos.matricula %}<div class="info-item flex flex-col"><label class="text-xs text-slate-500 mb-1 font-semibold uppercase">Matrícula</label><span><strong>{{ win.basicos.matricula }}</strong></span></div>{% endif %}
{% if win.basicos.nome %}<div class="info-item flex flex-col"><label class="text-xs text-slate-500 mb-1 font-semibold uppercase">Nome</label><span><strong>{{ win.basicos.nome }}</strong></span></div>{% endif %}
{% if win.basicos.cpf %}<div class="info-item flex flex-col"><label class="text-xs text-slate-500 mb-1 font-semibold uppercase">CPF</label><span>{{ win.basicos.cpf }}</span></div>{% endif %}
</div>
{% endif %}
{% if win.admissao %}
<h5 class="text-slate-400 text-xs uppercase mt-6 mb-4 font-bold tracking-wider border-b border-slate-100 pb-2">Admissão e Situação</h5>
<div class="info-grid grid grid-cols-1 md:grid-cols-[repeat(auto-fill,minmax(200px,1fr))] gap-6 mb-6">
{% if win.admissao.admissao %}<div class="info-item flex flex-col"><label class="text-xs text-slate-500 mb-1 font-semibold uppercase">Data de Admissão</label><span>{% if win.admissao.admissao|date:"d/m/Y" %}{{ win.admissao.admissao|date:"d/m/Y" }}{% else %}{{ win.admissao.admissao }}{% endif %}</span></div>{% endif %}
{% if win.admissao.situacao %}<div class="info-item flex flex-col"><label class="text-xs text-slate-500 mb-1 font-semibold uppercase">Situação</label><span>{{ win.admissao.situacao }}</span></div>{% endif %}
{% if win.admissao.dt_exclusao %}<div class="info-item flex flex-col"><label class="text-xs text-slate-500 mb-1 font-semibold uppercase">Data de Exclusão</label><span>{% if win.admissao.dt_exclusao|date:"d/m/Y" %}{{ win.admissao.dt_exclusao|date:"d/m/Y" }}{% else %}{{ win.admissao.dt_exclusao }}{% endif %}</span></div>{% endif %}
</div>
{% endif %}
{% if win.endereco %}
<h5 class="text-slate-400 text-xs uppercase mt-6 mb-4 font-bold tracking-wider border-b border-slate-100 pb-2">Endereço</h5>
<div class="info-grid grid grid-cols-1 md:grid-cols-[repeat(auto-fill,minmax(200px,1fr))] gap-6 mb-6">
{% if win.endereco.endereco %}<div class="info-item flex flex-col md:col-span-full"><label class="text-xs text-slate-500 mb-1 font-semibold uppercase">Endereço</label><span>{{ win.endereco.endereco }}</span></div>{% endif %}
{% if win.endereco.bairro %}<div class="info-item flex flex-col"><label class="text-xs text-slate-500 mb-1 font-semibold uppercase">Bairro</label><span>{{ win.endereco.bairro }}</span></div>{% endif %}
{% if win.endereco.cidade %}<div class="info-item flex flex-col"><label class="text-xs text-slate-500 mb-1 font-semibold uppercase">Cidade</label><span>{{ win.endereco.cidade }}</span></div>{% endif %}
{% if win.endereco.estado %}<div class="info-item flex flex-col"><label class="text-xs text-slate-500 mb-1 font-semibold uppercase">Estado</label><span>{{ win.endereco.estado }}</span></div>{% endif %}
</div>
{% endif %}
</div>
</div>
{% endwith %}
{% endif %}
{% endfor %}
<div class="tab-pane" data-tab="auditoria">
<div class="details-section mb-6 bg-white p-6 rounded-xl border border-slate-200">
<h5 class="text-slate-400 text-xs uppercase mt-6 mb-4 font-bold tracking-wider border-b border-slate-100 pb-2 first:mt-0">Status Atual</h5>
<div class="info-grid grid grid-cols-1 md:grid-cols-[repeat(auto-fill,minmax(200px,1fr))] gap-6 mb-6">
<div class="info-item flex flex-col"><label class="text-xs text-slate-500 mb-1 font-semibold uppercase">Status</label><span class="status-badge status-{{ solicitacao.status }}">{{ solicitacao.get_status_display }}</span></div>
<div class="info-item flex flex-col"><label class="text-xs text-slate-500 mb-1 font-semibold uppercase">Última Modificação</label><span>{{ solicitacao.atualizado_em|date:"d/m/Y H:i" }}</span></div>
</div>
<h5 class="text-slate-400 text-xs uppercase mt-6 mb-4 font-bold tracking-wider border-b border-slate-100 pb-2">Histórico de Aprovações</h5>
{% if solicitacao.aprovacoes.all %}
<div class="timeline pl-8 border-l-2 border-slate-200 ml-2">
{% for aprovacao in solicitacao.aprovacoes.all %}
<div class="timeline-item relative pb-8 pl-6 last:pb-0 before:content-[''] before:absolute before:-left-[2.4rem] before:top-1 before:w-3.5 before:h-3.5 before:rounded-full before:bg-slate-300 before:border-[3px] before:border-white before:shadow-[0_0_0_1px_#e2e8f0]">
<div class="timeline-header flex flex-wrap gap-2 mb-1 text-sm items-baseline">
<span class="timeline-user font-semibold text-slate-800">{{ aprovacao.usuario.nome }}</span>
<span class="timeline-action text-slate-500">{% if aprovacao.decisao == 'APROVADO' %}<span class="text-emerald-500">aprovou</span>{% else %}<span class="text-red-500">reprovou</span>{% endif %} em {{ aprovacao.get_etapa_display }}</span>
<span class="timeline-date text-xs text-slate-400 ml-auto">{{ aprovacao.decidido_em|date:"d/m/Y H:i" }}</span>
</div>
{% if aprovacao.justificativa %}<div class="timeline-justificativa mt-3 p-4 bg-slate-50 rounded-lg text-sm text-slate-700 border border-slate-200 italic">"{{ aprovacao.justificativa }}"</div>{% endif %}
</div>
{% endfor %}
</div>
{% else %}
<p class="text-slate-500 italic bg-slate-50 p-2.5 rounded-md">⏳ Nenhuma aprovação registrada ainda.</p>
{% endif %}
{% if solicitacao.pareceres.all %}
<h5 class="text-slate-400 text-xs uppercase mt-6 mb-4 font-bold tracking-wider border-b border-slate-100 pb-2">Pareceres Técnicos</h5>
<div class="mb-6">
{% for parecer in solicitacao.pareceres.all %}
<div class="bg-white p-4 rounded-lg mb-3 border border-slate-200 shadow-sm">
<div class="flex justify-between mb-2"><strong class="text-slate-800">{{ parecer.get_etapa_display }}</strong><small class="text-slate-500">{{ parecer.criado_em|date:"d/m/Y H:i" }}</small></div>
<small class="text-slate-500 block mb-2">Autor: {{ parecer.usuario.nome }}</small>
<p class="m-0 text-slate-700 leading-relaxed">{{ parecer.texto }}</p>
{% if parecer.anexo %}<div class="mt-3 pt-3 border-t border-dashed border-slate-200"><a href="{{ parecer.anexo.url }}" target="_blank" class="text-primary no-underline text-sm font-medium">📎 Visualizar Anexo ({{ parecer.anexo.name|slice:"20:" }})</a></div>{% endif %}
</div>
{% endfor %}
</div>
{% endif %}
{% if solicitacao.solicitante.id == usuario_sistema.id and solicitacao.status != 'RASCUNHO' %}
<div class="bg-slate-100 rounded-lg py-4 px-4 mt-6 text-slate-500 text-center text-sm">👁️ Você é o solicitante. Acompanhe o status acima.</div>
{% endif %}
</div>
</div>
</div>
</td>
</tr>
{% endwith %}
{% endfor %}
</tbody>
</table>
</div>
<div id="no-results" class="empty-state text-center py-16 px-5 text-slate-500 bg-white rounded-xl border-2 border-dashed border-slate-300 hidden">
<p class="m-0 text-lg">🔍 Nenhuma solicitação encontrada com este filtro.</p>
</div>
{% if solicitacoes.has_other_pages %}
<div class="pagination mt-6 flex items-center justify-center gap-1.5 flex-wrap">
{% if solicitacoes.has_previous %}<a href="?page=1" class="py-2 px-3.5 no-underline border border-slate-200 rounded-md text-slate-600 bg-white text-sm transition-all hover:bg-slate-50 hover:border-slate-300 hover:text-slate-800">« Primeira</a><a href="?page={{ solicitacoes.previous_page_number }}" class="py-2 px-3.5 no-underline border border-slate-200 rounded-md text-slate-600 bg-white text-sm transition-all hover:bg-slate-50 hover:border-slate-300 hover:text-slate-800"> Anterior</a>{% endif %}
<span class="current py-2 px-3.5 bg-primary text-white rounded-md font-medium border border-primary">{{ solicitacoes.number }} / {{ solicitacoes.paginator.num_pages }}</span>
{% if solicitacoes.has_next %}<a href="?page={{ solicitacoes.next_page_number }}" class="py-2 px-3.5 no-underline border border-slate-200 rounded-md text-slate-600 bg-white text-sm transition-all hover:bg-slate-50 hover:border-slate-300 hover:text-slate-800">Próxima </a><a href="?page={{ solicitacoes.paginator.num_pages }}" class="py-2 px-3.5 no-underline border border-slate-200 rounded-md text-slate-600 bg-white text-sm transition-all hover:bg-slate-50 hover:border-slate-300 hover:text-slate-800">Última »</a>{% endif %}
</div>
{% endif %}
{% else %}
<div class="empty-state text-center py-16 px-5 text-slate-500 bg-white rounded-xl border-2 border-dashed border-slate-300">
<p class="m-0 text-lg">🎉 Nenhuma solicitação encontrada.</p>
{% if usuario_sistema.perfil == 'GESTOR' %}<p class="text-sm mt-2">Use o botão "Nova Solicitação" para começar.</p>{% endif %}
</div>
{% endif %}
</div>
{% endblock %}
{% block scripts %}
<script>
function filtrarTabela(status, cardElement) {
document.querySelectorAll('.metric-card').forEach(c => c.classList.remove('active'));
if (cardElement) cardElement.classList.add('active');
const rows = document.querySelectorAll('.request-row');
let visibleCount = 0;
rows.forEach(row => {
const categoria = row.getAttribute('data-status');
let show = (status === 'todos') || (status === 'pendente' && categoria === 'pendente');
if (show) { row.style.display = ''; visibleCount++; } else {
row.style.display = 'none';
const solicitacaoId = row.getAttribute('data-id');
const detailsRow = document.getElementById('details-' + solicitacaoId);
if (detailsRow && detailsRow.style.display !== 'none') { detailsRow.style.display = 'none'; row.classList.remove('expanded'); }
}
});
const noResults = document.getElementById('no-results');
const tableContainer = document.querySelector('.table-responsive');
if (noResults && tableContainer) { noResults.style.display = visibleCount === 0 ? 'block' : 'none'; tableContainer.style.display = visibleCount === 0 ? 'none' : 'block'; }
}
function toggleDetails(solicitacaoId, rowElement) {
const detailsRow = document.getElementById('details-' + solicitacaoId);
if (!detailsRow) return;
if (detailsRow.style.display === 'none' || detailsRow.style.display === '') {
document.querySelectorAll('.details-row').forEach(row => { row.style.display = 'none'; });
document.querySelectorAll('.request-row').forEach(row => { row.classList.remove('expanded'); });
detailsRow.style.display = 'table-row';
if (rowElement) rowElement.classList.add('expanded');
} else {
detailsRow.style.display = 'none';
if (rowElement) rowElement.classList.remove('expanded');
}
}
function switchTab(event, tabName, solicitacaoId) {
event.preventDefault(); event.stopPropagation();
const wrapper = document.getElementById('wrapper-' + solicitacaoId);
if (!wrapper) return;
wrapper.querySelectorAll('.tab-btn').forEach(btn => btn.classList.remove('active'));
wrapper.querySelectorAll('.tab-pane').forEach(pane => pane.classList.remove('active'));
event.currentTarget.classList.add('active');
const targetPane = wrapper.querySelector('.tab-pane[data-tab="' + tabName + '"]');
if (targetPane) targetPane.classList.add('active');
}
document.addEventListener('DOMContentLoaded', function() {
const cardTotal = document.querySelector('.card-total');
if (cardTotal) filtrarTabela('todos', cardTotal);
});
function abrirModalAprovacao(solicitacaoId, decisao) {
const modal = document.getElementById('modal-aprovacao');
const form = document.getElementById('form-aprovacao');
const decisaoInput = document.getElementById('decisao-input');
const justificativaDiv = document.getElementById('justificativa-div');
const justificativaInput = document.getElementById('justificativa-input');
const tituloModal = document.getElementById('titulo-modal');
decisaoInput.value = decisao;
justificativaInput.value = '';
justificativaInput.removeAttribute('required');
if (decisao === 'REPROVADO') {
tituloModal.textContent = 'Reprovar Solicitação';
tituloModal.style.color = '#ef4444';
justificativaDiv.style.display = 'block';
justificativaInput.setAttribute('required', 'required');
justificativaInput.placeholder = 'Descreva o motivo da reprovação...';
} else {
tituloModal.textContent = 'Aprovar Solicitação';
tituloModal.style.color = '#10b981';
justificativaDiv.style.display = 'none';
}
form.action = '/solicitacao/' + solicitacaoId + '/decidir/';
modal.style.display = 'flex';
}
function fecharModalAprovacao() { document.getElementById('modal-aprovacao').style.display = 'none'; }
window.onclick = function(event) { if (event.target === document.getElementById('modal-aprovacao')) fecharModalAprovacao(); };
document.querySelectorAll('.decisao-select').forEach(function(select) {
select.addEventListener('change', function() {
var form = this.closest('form');
var justificativa = form.querySelector('.justificativa-input');
var requiredMarker = form.querySelector('.justificativa-required');
if (this.value === 'REPROVADO') { justificativa.setAttribute('required', 'required'); if (requiredMarker) requiredMarker.style.display = 'inline'; justificativa.placeholder = 'Descreva o motivo da reprovação...'; }
else { justificativa.removeAttribute('required'); if (requiredMarker) requiredMarker.style.display = 'none'; justificativa.placeholder = 'Opcional para aprovação...'; }
});
});
document.querySelectorAll('.form-decisao-dashboard').forEach(function(form) {
form.addEventListener('submit', function(e) {
var decisao = form.querySelector('.decisao-select').value;
var justificativa = form.querySelector('.justificativa-input').value.trim();
if (decisao === 'REPROVADO' && !justificativa) { e.preventDefault(); alert('A justificativa é obrigatória para reprovações.'); form.querySelector('.justificativa-input').focus(); }
});
});
</script>
<div id="modal-aprovacao" class="hidden fixed inset-0 z-[1000] bg-black/50 items-center justify-center" style="display: none;">
<div class="modal-content bg-white p-8 rounded-xl max-w-md w-[90%] shadow-xl border border-slate-200">
<h3 id="titulo-modal" class="mt-0 mb-5 text-xl font-semibold">Aprovar Solicitação</h3>
<form id="form-aprovacao" method="post" action="">
{% csrf_token %}
<input type="hidden" id="decisao-input" name="decisao" value="">
<div id="justificativa-div" class="hidden mb-5">
<label for="justificativa-input" class="block mb-2 font-semibold text-slate-700">Justificativa Obrigatória <span class="text-red-500">*</span></label>
<textarea id="justificativa-input" name="justificativa" rows="4" class="w-full p-2.5 border border-slate-300 rounded-md font-sans text-sm focus:outline-none focus:border-primary focus:ring-2 focus:ring-primary/20" placeholder="Descreva o motivo..."></textarea>
</div>
<div class="flex gap-2.5 justify-end mt-6">
<button type="button" onclick="fecharModalAprovacao()" class="py-2.5 px-5 bg-white text-slate-500 border border-slate-300 rounded-md cursor-pointer font-semibold hover:bg-slate-50">Cancelar</button>
<button type="submit" class="py-2.5 px-6 bg-primary text-white border-none rounded-md cursor-pointer font-semibold shadow-sm">Confirmar</button>
</div>
</form>
</div>
</div>
{% endblock %}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,71 @@
{% extends "base.html" %}
{% block title %}Criar Admissão por Aumento de Quadro - SGMP{% endblock %}
{% block css %}
<style>
.form-group-filial input[type="number"] { max-width: 6em; -moz-appearance: textfield; }
.form-group-filial input[type="number"]::-webkit-outer-spin-button,
.form-group-filial input[type="number"]::-webkit-inner-spin-button { -webkit-appearance: none; margin: 0; }
</style>
{% endblock %}
{% block content %}
<div class="bg-white border border-slate-200 rounded-lg p-6 max-w-3xl mx-auto">
<div class="mb-6 pb-4 border-b border-slate-200">
<h2 class="text-xl font-semibold text-slate-700 m-0">Criar Admissão por Aumento de Quadro</h2>
</div>
{% if messages %}
<div class="mb-6">
<ul class="list-none p-0 m-0 space-y-2">
{% for message in messages %}
<li class="py-3 px-4 rounded-lg text-sm {% if message.tags == 'error' %}bg-red-100 text-red-800 border border-red-200{% elif message.tags == 'success' %}bg-emerald-100 text-emerald-800 border border-emerald-200{% else %}bg-blue-100 text-blue-800 border border-blue-200{% endif %}">{{ message }}</li>
{% endfor %}
</ul>
</div>
{% endif %}
<form method="post">
{% csrf_token %}
<div class="grid grid-cols-1 md:grid-cols-2 gap-5">
<div>
<label for="data_previsao" class="block text-sm font-medium text-slate-700 mb-1">Data Prevista de Contratação *</label>
<input type="date" name="data_previsao" id="data_previsao" class="w-full py-2.5 px-4 border border-slate-200 rounded-lg text-base focus:outline-none focus:border-primary focus:ring-2 focus:ring-primary/20" required>
</div>
<div>
<label for="cod_coligada" class="block text-sm font-medium text-slate-700 mb-1">Código Coligada Destino *</label>
<select name="cod_coligada" id="cod_coligada" class="w-full py-2.5 px-4 border border-slate-200 rounded-lg text-base focus:outline-none focus:border-primary focus:ring-2 focus:ring-primary/20" required>
<option value="">Selecione a coligada...</option>
{% for col in coligadas %}<option value="{{ col.codigo }}">{{ col.nome }}</option>{% endfor %}
</select>
</div>
<div class="form-group-filial">
<label for="cod_filial" class="block text-sm font-medium text-slate-700 mb-1">Código Filial Destino *</label>
<input type="number" name="cod_filial" id="cod_filial" min="1" max="13" step="1" required placeholder="1 a 13" inputmode="numeric" autocomplete="off" aria-describedby="cod_filial_help" class="w-full py-2.5 px-4 border border-slate-200 rounded-lg text-base focus:outline-none focus:border-primary focus:ring-2 focus:ring-primary/20">
<small id="cod_filial_help" class="block mt-1 text-xs text-slate-500">Informe o código da filial (entre 1 e 13).</small>
</div>
<div>
<label for="cod_secao" class="block text-sm font-medium text-slate-700 mb-1">Seção/Centro de Custo Destino *</label>
<select name="cod_secao" id="cod_secao" class="w-full py-2.5 px-4 border border-slate-200 rounded-lg text-base focus:outline-none focus:border-primary focus:ring-2 focus:ring-primary/20" required>
<option value="">Selecione uma seção...</option>
{% for secao in secoes %}<option value="{{ secao.codigo }}">{{ secao.descricao }}</option>{% endfor %}
</select>
</div>
<div>
<label for="cod_funcao" class="block text-sm font-medium text-slate-700 mb-1">Função/Cargo Destino *</label>
<select name="cod_funcao" id="cod_funcao" class="w-full py-2.5 px-4 border border-slate-200 rounded-lg text-base focus:outline-none focus:border-primary focus:ring-2 focus:ring-primary/20" required>
<option value="">Selecione um cargo...</option>
{% for cargo in cargos %}<option value="{{ cargo.codigo }}">{{ cargo.nome }}</option>{% endfor %}
</select>
</div>
<div class="md:col-span-2">
<label for="justificativa" class="block text-sm font-medium text-slate-700 mb-1">Justificativa Estratégica *</label>
<textarea name="justificativa" id="justificativa" required placeholder="Descreva a justificativa estratégica para o aumento de quadro..." class="w-full py-2.5 px-4 border border-slate-200 rounded-lg text-base min-h-[120px] resize-y focus:outline-none focus:border-primary focus:ring-2 focus:ring-primary/20"></textarea>
</div>
</div>
<div class="mt-6 pt-6 border-t border-slate-200 flex flex-wrap gap-3">
<button type="submit" class="py-2.5 px-5 bg-primary text-white border-0 rounded-lg font-medium cursor-pointer hover:bg-primary-hover transition-colors">Criar Solicitação</button>
<a href="{% url 'solicitacoes:dashboard' %}" class="py-2.5 px-5 bg-slate-500 text-white no-underline rounded-lg font-medium inline-block hover:bg-slate-600 transition-colors">Cancelar</a>
</div>
</form>
</div>
{% endblock %}

View File

@ -0,0 +1,68 @@
{% extends "base.html" %}
{% block title %}Criar Admissão por Substituição - SGMP{% endblock %}
{% block content %}
<div class="bg-white border border-slate-200 rounded-lg p-6 max-w-3xl mx-auto">
<div class="mb-6 pb-4 border-b border-slate-200">
<h2 class="text-xl font-semibold text-slate-700 m-0">Criar Admissão por Substituição</h2>
</div>
{% if messages %}
<div class="mb-6">
<ul class="list-none p-0 m-0 space-y-2">
{% for message in messages %}
<li class="py-3 px-4 rounded-lg text-sm {% if message.tags == 'error' %}bg-red-100 text-red-800 border border-red-200{% elif message.tags == 'success' %}bg-emerald-100 text-emerald-800 border border-emerald-200{% else %}bg-blue-100 text-blue-800 border border-blue-200{% endif %}">{{ message }}</li>
{% endfor %}
</ul>
</div>
{% endif %}
<div class="bg-slate-50 border border-slate-200 border-l-4 border-l-primary rounded-lg p-5 mb-6">
<h3 class="text-base font-semibold text-slate-700 m-0 mb-4">Colaborador a ser Substituído</h3>
<div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-3">
<div><span class="block text-sm text-slate-500 font-medium">Nome</span><span class="text-slate-700 font-medium">{{ funcionario.nome }}</span></div>
<div><span class="block text-sm text-slate-500 font-medium">Matrícula</span><span class="text-slate-700 font-medium">{{ funcionario.matricula }}</span></div>
<div><span class="block text-sm text-slate-500 font-medium">Cargo</span><span class="text-slate-700 font-medium">{{ funcionario.cargo|default:"N/A" }}</span></div>
<div><span class="block text-sm text-slate-500 font-medium">Setor</span><span class="text-slate-700 font-medium">{{ funcionario.setor|default:"N/A" }}</span></div>
</div>
</div>
<form method="post">
{% csrf_token %}
<div class="grid grid-cols-1 md:grid-cols-2 gap-5">
<div>
<label for="data_previsao" class="block text-sm font-medium text-slate-700 mb-1">Data Prevista de Contratação *</label>
<input type="date" name="data_previsao" id="data_previsao" class="w-full py-2.5 px-4 border border-slate-200 rounded-lg text-base focus:outline-none focus:border-primary focus:ring-2 focus:ring-primary/20" required>
</div>
<div>
<label for="cod_coligada" class="block text-sm font-medium text-slate-700 mb-1">Código Coligada Destino *</label>
<input type="number" name="cod_coligada" id="cod_coligada" class="w-full py-2.5 px-4 border border-slate-200 rounded-lg text-base focus:outline-none focus:border-primary focus:ring-2 focus:ring-primary/20" required>
</div>
<div>
<label for="cod_filial" class="block text-sm font-medium text-slate-700 mb-1">Código Filial Destino *</label>
<input type="number" name="cod_filial" id="cod_filial" class="w-full py-2.5 px-4 border border-slate-200 rounded-lg text-base focus:outline-none focus:border-primary focus:ring-2 focus:ring-primary/20" required>
</div>
<div>
<label for="cod_secao" class="block text-sm font-medium text-slate-700 mb-1">Seção/Centro de Custo Destino *</label>
<select name="cod_secao" id="cod_secao" class="w-full py-2.5 px-4 border border-slate-200 rounded-lg text-base focus:outline-none focus:border-primary focus:ring-2 focus:ring-primary/20" required>
<option value="">Selecione uma seção...</option>
{% for secao in secoes %}<option value="{{ secao.codigo }}">{{ secao.descricao }}</option>{% endfor %}
</select>
</div>
<div>
<label for="cod_funcao" class="block text-sm font-medium text-slate-700 mb-1">Função/Cargo Destino *</label>
<select name="cod_funcao" id="cod_funcao" class="w-full py-2.5 px-4 border border-slate-200 rounded-lg text-base focus:outline-none focus:border-primary focus:ring-2 focus:ring-primary/20" required>
<option value="">Selecione um cargo...</option>
{% for cargo in cargos %}<option value="{{ cargo.codigo }}">{{ cargo.nome }}</option>{% endfor %}
</select>
</div>
<div class="md:col-span-2">
<label for="justificativa" class="block text-sm font-medium text-slate-700 mb-1">Justificativa *</label>
<textarea name="justificativa" id="justificativa" required placeholder="Descreva a justificativa para a substituição..." class="w-full py-2.5 px-4 border border-slate-200 rounded-lg text-base min-h-[120px] resize-y focus:outline-none focus:border-primary focus:ring-2 focus:ring-primary/20"></textarea>
</div>
</div>
<div class="mt-6 pt-6 border-t border-slate-200 flex flex-wrap gap-3">
<button type="submit" class="py-2.5 px-5 bg-primary text-white border-0 rounded-lg font-medium cursor-pointer hover:bg-primary-hover transition-colors">Criar Solicitação</button>
<a href="{% url 'solicitacoes:listar_colaboradores' %}" class="py-2.5 px-5 bg-slate-500 text-white no-underline rounded-lg font-medium inline-block hover:bg-slate-600 transition-colors">Cancelar</a>
</div>
</form>
</div>
{% endblock %}

View File

@ -0,0 +1,170 @@
{% extends "base.html" %}
{% block title %}Criar Desligamento - SGMP{% endblock %}
{% block css %}
<style>
.stability-item.blocked { border-left-color: #ef4444; }
.stability-item.warning { border-left-color: #f59e0b; }
.btn-blocked { background-color: #94a3b8; color: white; cursor: not-allowed; opacity: 0.8; }
.btn-blocked:hover { background-color: #94a3b8; }
</style>
{% endblock %}
{% block content %}
<div class="mb-6 flex items-center gap-3">
<span class="text-3xl">🚫</span>
<h1 class="text-2xl font-bold text-slate-800">Solicitação de Desligamento</h1>
</div>
{% if messages %}
<div class="mb-6 space-y-2">
{% for message in messages %}
<div class="py-3 px-4 rounded-lg flex items-center gap-2 text-sm {% if message.tags == 'error' %}bg-red-50 text-red-800 border border-red-200{% else %}bg-emerald-50 text-emerald-800 border border-emerald-200{% endif %}">
{% if message.tags == 'error' %}⚠️{% else %}✅{% endif %} {{ message }}
</div>
{% endfor %}
</div>
{% endif %}
<!-- Dados do Colaborador -->
<div class="bg-white rounded-xl border border-slate-200 shadow-sm overflow-hidden mb-6">
<div class="px-5 py-4 bg-slate-50 border-b border-slate-200 flex items-center gap-2">
<span class="text-xl">👤</span>
<h3 class="text-base font-semibold text-slate-700 m-0">Dados do Colaborador</h3>
</div>
<div class="p-5">
<div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-5 gap-4">
<div><span class="block text-xs uppercase text-slate-500 font-semibold mb-0.5">Nome</span><strong class="text-slate-800">{{ funcionario.nome }}</strong></div>
<div><span class="block text-xs uppercase text-slate-500 font-semibold mb-0.5">Matrícula</span><span class="text-slate-800 font-medium">{{ funcionario.matricula }}</span></div>
<div><span class="block text-xs uppercase text-slate-500 font-semibold mb-0.5">Cargo</span><span class="text-slate-800 font-medium">{{ funcionario.cargo|default:"N/A" }}</span></div>
<div><span class="block text-xs uppercase text-slate-500 font-semibold mb-0.5">Setor</span><span class="text-slate-800 font-medium">{{ funcionario.setor|default:"N/A" }}</span></div>
<div><span class="block text-xs uppercase text-slate-500 font-semibold mb-0.5">Admissão</span><span class="text-slate-800 font-medium">{{ funcionario.data_admissao|date:"d/m/Y"|default:"N/A" }}</span></div>
{% if funcionario.saldo_banco_horas_minutos %}
<div>
<span class="block text-xs uppercase text-slate-500 font-semibold mb-0.5">Banco de Horas <span class="cursor-help text-slate-500 ml-0.5" title="Valores negativos serão descontados na rescisão."></span></span>
<span class="font-bold {% if funcionario.saldo_banco_horas_minutos < 0 %}text-red-500{% else %}text-emerald-600{% endif %}">{{ funcionario.saldo_banco_horas_minutos }} min</span>
{% if funcionario.saldo_banco_horas_minutos < 0 %}<div class="text-xs text-red-500 mt-0.5">Saldo negativo a descontar.</div>{% endif %}
</div>
{% endif %}
</div>
</div>
</div>
{% if estabilidades_bloqueantes %}
<div class="rounded-xl overflow-hidden border border-red-200 bg-red-50 mb-6">
<div class="px-5 py-4 bg-red-100 text-red-800 font-bold flex items-center gap-2 border-b border-red-200">
<span class="text-xl"></span> DESLIGAMENTO BLOQUEADO
</div>
<div class="px-5 pt-4 text-red-900">O colaborador possui estabilidade ativa que impede o desligamento.</div>
<ul class="list-none p-5 m-0">
{% for estabilidade in estabilidades_bloqueantes %}
<li class="stability-item blocked bg-white p-4 rounded-lg border-l-4 mb-3 last:mb-0 shadow-sm">
<span class="block font-semibold text-red-800 mb-1">
{% if estabilidade.tipo == "MATERNIDADE" %}Licença Maternidade{% elif estabilidade.tipo == "PREVIDENCIARIO" %}Afastamento Previdenciário{% elif estabilidade.tipo == "ACIDENTE_TRABALHO" %}Acidente de Trabalho{% elif estabilidade.tipo == "CIPA" %}Membro da CIPA{% else %}{{ estabilidade.tipo }}{% endif %}
</span>
<div class="text-red-900">{{ estabilidade.mensagem }}</div>
{% if estabilidade.detalhes %}
<div class="text-sm text-slate-500 mt-2 pt-2 border-t border-dashed border-slate-200">
{% if estabilidade.detalhes.dt_inicio %}Início: {{ estabilidade.detalhes.dt_inicio|date:"d/m/Y" }} | {% endif %}
{% if estabilidade.detalhes.dt_final %}Fim: <strong>{{ estabilidade.detalhes.dt_final|date:"d/m/Y" }}</strong>{% endif %}
{% if estabilidade.detalhes.observacao %}<br>Obs: {{ estabilidade.detalhes.observacao }}{% endif %}
</div>
{% endif %}
</li>
{% endfor %}
</ul>
</div>
{% elif estabilidades %}
<div class="rounded-xl overflow-hidden border border-amber-200 bg-amber-50 mb-6">
<div class="px-5 py-4 bg-amber-100 text-amber-800 font-bold flex items-center gap-2 border-b border-amber-200">
<span class="text-xl">⚠️</span> Atenção: Estabilidades Identificadas
</div>
<ul class="list-none p-5 m-0">
{% for estabilidade in estabilidades %}
{% if not estabilidade.bloqueado %}
<li class="stability-item warning bg-white p-4 rounded-lg border-l-4 mb-3 last:mb-0 shadow-sm">
<span class="block font-semibold text-amber-800 mb-1">Estabilidade (Não Bloqueante)</span>
<div class="text-amber-900">{{ estabilidade.mensagem }}</div>
</li>
{% endif %}
{% endfor %}
</ul>
</div>
{% endif %}
<form method="post" enctype="multipart/form-data" id="form-desligamento">
{% csrf_token %}
<div class="bg-white rounded-xl border border-slate-200 shadow-sm overflow-hidden mb-6">
<div class="px-5 py-4 bg-slate-50 border-b border-slate-200 flex items-center gap-2">
<span class="text-xl">📉</span>
<h3 class="text-base font-semibold text-slate-700 m-0">Detalhes do Desligamento</h3>
</div>
<div class="p-5 grid grid-cols-1 md:grid-cols-2 gap-4">
<div class="md:col-span-2">
<label for="tipo_desligamento" class="block text-sm font-medium text-slate-700 mb-1">Tipo de Desligamento <span class="text-red-500">*</span></label>
<select name="tipo_desligamento" id="tipo_desligamento" class="w-full py-2.5 px-3 border border-slate-200 rounded-md focus:outline-none focus:border-primary focus:ring-2 focus:ring-primary/20" required onchange="toggleAnexo(this.value)">
<option value="">Selecione o tipo...</option>
<option value="PEDIDO_DEMISSAO">Pedido de Demissão</option>
<option value="SEM_JUSTA_CAUSA">Demissão sem Justa Causa</option>
<option value="COM_JUSTA_CAUSA">Demissão por Justa Causa</option>
<option value="TERMINO_CONTRATO">Término de Contrato de Experiência</option>
<option value="OUTROS">Outros</option>
</select>
</div>
<div>
<label for="aviso_previo" class="block text-sm font-medium text-slate-700 mb-1">Aviso Prévio <span class="text-red-500">*</span></label>
<select name="aviso_previo" id="aviso_previo" class="w-full py-2.5 px-3 border border-slate-200 rounded-md focus:outline-none focus:border-primary focus:ring-2 focus:ring-primary/20" required>
<option value="">Selecione...</option>
<option value="TRABALHADO">Trabalhado</option>
<option value="INDENIZADO">Indenizado (Dispensa imediata)</option>
<option value="DISPENSADO">Dispensado (Pedido de demissão)</option>
</select>
</div>
<div>
<label for="data_prevista_desligamento" class="block text-sm font-medium text-slate-700 mb-1">Data Prevista de Saída <span class="text-red-500">*</span></label>
<input type="date" name="data_prevista_desligamento" id="data_prevista_desligamento" class="w-full py-2.5 px-3 border border-slate-200 rounded-md focus:outline-none focus:border-primary focus:ring-2 focus:ring-primary/20" required>
</div>
<div class="md:col-span-2">
<label for="motivo" class="block text-sm font-medium text-slate-700 mb-1">Detalhamento / Justificativa <span class="text-red-500">*</span></label>
<textarea name="motivo" id="motivo" class="w-full py-2.5 px-3 border border-slate-200 rounded-md focus:outline-none focus:border-primary focus:ring-2 focus:ring-primary/20" rows="3" required placeholder="Descreva os detalhes da decisão..."></textarea>
</div>
<div class="md:col-span-2 hidden bg-slate-50 p-4 border border-dashed border-slate-300 rounded-md" id="div-carta-demissao">
<label for="arquivo_pedido" class="block text-sm font-medium text-slate-700 mb-1">Carta de Pedido de Demissão <span class="text-red-500">*</span></label>
<input type="file" name="arquivo_pedido" id="arquivo_pedido" class="w-full py-2 px-3 border border-slate-200 rounded-md focus:outline-none focus:border-primary" accept=".pdf,.jpg,.jpeg,.png,.doc,.docx">
<small class="block text-slate-500 mt-1 text-sm">Anexe a carta de próprio punho digitalizada ou e-mail formal do colaborador.</small>
</div>
<div class="md:col-span-2">
<label for="observacoes" class="block text-sm font-medium text-slate-700 mb-1">Observações Adicionais (Opcional)</label>
<textarea name="observacoes" id="observacoes" class="w-full py-2.5 px-3 border border-slate-200 rounded-md focus:outline-none focus:border-primary focus:ring-2 focus:ring-primary/20" rows="2" placeholder="Informações extras para o Depto Pessoal..."></textarea>
</div>
</div>
</div>
<div class="flex flex-wrap gap-3">
<button type="button" onclick="confirmarEnvio()" class="py-2.5 px-5 rounded-md font-semibold transition-colors {% if desligamento_bloqueado %}btn-blocked{% else %}bg-red-600 text-white hover:bg-red-700{% endif %}" {% if desligamento_bloqueado %}disabled{% endif %}>
{% if desligamento_bloqueado %}🚫 Ação Bloqueada{% else %}🗑️ Confirmar Solicitação{% endif %}
</button>
<a href="{% url 'solicitacoes:listar_colaboradores' %}" class="py-2.5 px-5 rounded-md font-semibold border border-slate-200 bg-white text-slate-700 hover:bg-slate-50 no-underline">Cancelar</a>
</div>
</form>
<script>
function toggleAnexo(valor) {
const divAnexo = document.getElementById('div-carta-demissao');
const inputAnexo = document.getElementById('arquivo_pedido');
if (valor === 'PEDIDO_DEMISSAO') {
divAnexo.classList.remove('hidden');
inputAnexo.setAttribute('required', 'required');
} else {
divAnexo.classList.add('hidden');
inputAnexo.removeAttribute('required');
}
}
function confirmarEnvio() {
if (confirm("⚠️ Tem certeza que deseja solicitar o desligamento deste colaborador?\n\nEsta ação notificará o RH e iniciará o processo de desligamento.")) {
document.getElementById('form-desligamento').submit();
}
}
</script>
{% endblock %}

View File

@ -0,0 +1,148 @@
{% extends "base.html" %}
{% block title %}Gerenciar Permissões - SGMP{% endblock %}
{% block css %}
<style>
.perfil-GESTOR { background: #dbeafe; color: #1e40af; }
.perfil-HEAD { background: #e0e7ff; color: #3730a3; }
.perfil-GG { background: #d1fae5; color: #065f46; }
.perfil-CONTROLADORIA { background: #fef3c7; color: #92400e; }
.perfil-DIRETORIA { background: #fce7f3; color: #9f1239; }
.ativo-badge.ativo { background: #d1fae5; color: #065f46; }
.ativo-badge.inativo { background: #fee2e2; color: #991b1b; }
</style>
{% endblock %}
{% block content %}
<div class="mb-8">
<h1 class="text-2xl font-bold text-slate-800 mb-2">Gerenciar Permissões</h1>
<p class="text-slate-500 text-sm">Gerencie os perfis e permissões dos usuários do sistema</p>
</div>
{% if messages %}
<div class="mb-5">
<ul class="list-none p-0 m-0">
{% for message in messages %}
<li class="py-3 px-4 mb-2 rounded-lg border {% if message.tags == 'error' %}bg-red-50 text-red-800 border-red-200{% else %}bg-emerald-50 text-emerald-800 border-emerald-200{% endif %}">{{ message }}</li>
{% endfor %}
</ul>
</div>
{% endif %}
<div class="bg-blue-50 border border-blue-200 rounded-lg p-4 mb-5 text-blue-800">
<strong class="block mb-1">Seu Perfil Atual:</strong>
<span class="perfil-badge inline-block py-1 px-3 rounded-xl text-xs font-semibold perfil-{{ usuario_sistema.perfil }}">{{ usuario_sistema.get_perfil_display }}</span>
<p class="mt-2 text-sm">Você pode alterar seu próprio perfil e o de outros usuários abaixo.</p>
</div>
<div class="bg-white p-5 rounded-lg shadow border border-slate-200 mb-5">
<form method="get" class="flex flex-wrap gap-3">
<input type="text" name="q" value="{{ busca }}" placeholder="Buscar por nome ou matrícula..." class="flex-1 min-w-[200px] py-2.5 px-3 border border-slate-200 rounded-md text-base focus:outline-none focus:border-primary focus:ring-2 focus:ring-primary/20">
<button type="submit" class="py-2.5 px-5 bg-primary text-white border-0 rounded-md font-semibold cursor-pointer hover:bg-primary-hover transition-colors">Buscar</button>
{% if busca %}<a href="{% url 'solicitacoes:gerenciar_permissoes' %}" class="py-2.5 px-5 bg-slate-500 text-white no-underline rounded-md inline-block hover:bg-slate-600 transition-colors">Limpar</a>{% endif %}
</form>
</div>
<div class="bg-white rounded-lg shadow border border-slate-200 overflow-hidden">
<table class="w-full border-collapse">
<thead>
<tr>
<th class="p-3 text-left border-b border-slate-200 bg-slate-50 font-semibold text-slate-600">Matrícula</th>
<th class="p-3 text-left border-b border-slate-200 bg-slate-50 font-semibold text-slate-600">Nome</th>
<th class="p-3 text-left border-b border-slate-200 bg-slate-50 font-semibold text-slate-600">Perfil Atual</th>
<th class="p-3 text-left border-b border-slate-200 bg-slate-50 font-semibold text-slate-600">Status</th>
<th class="p-3 text-left border-b border-slate-200 bg-slate-50 font-semibold text-slate-600">Alterar Perfil</th>
<th class="p-3 text-left border-b border-slate-200 bg-slate-50 font-semibold text-slate-600">Head em relação a (gestores)</th>
</tr>
</thead>
<tbody>
{% for item in usuarios_com_gestores %}
{% with usuario=item.usuario gestores_com_selecao=item.gestores_com_selecao %}
<tr class="hover:bg-slate-50 border-b border-slate-200 last:border-b-0">
<td class="p-3 text-slate-800">{{ usuario.matricula }}</td>
<td class="p-3 text-slate-800">
{{ usuario.nome }}
{% if usuario.id == usuario_sistema.id %}<strong class="text-primary">(Você)</strong>{% endif %}
</td>
<td class="p-3">
<span class="perfil-badge inline-block py-1 px-3 rounded-xl text-xs font-semibold perfil-{{ usuario.perfil }}">{{ usuario.get_perfil_display }}</span>
</td>
<td class="p-3">
<span class="ativo-badge inline-block py-1 px-2 rounded-lg text-[11px] font-semibold {% if usuario.ativo %}ativo{% else %}inativo{% endif %}">{% if usuario.ativo %}Ativo{% else %}Inativo{% endif %}</span>
</td>
<td class="p-3">
<form method="post" class="flex flex-col gap-2">
{% csrf_token %}
<input type="hidden" name="usuario_id" value="{{ usuario.id }}">
<div class="flex flex-wrap gap-2 items-center">
<select name="perfil" required class="py-1.5 px-2.5 border border-slate-200 rounded-md text-sm focus:outline-none focus:border-primary">
{% for valor, label in perfis %}
<option value="{{ valor }}" {% if usuario.perfil == valor %}selected{% endif %}>{{ label }}</option>
{% endfor %}
</select>
<button type="submit" class="py-1.5 px-3 bg-primary text-white border-0 rounded-md text-sm font-semibold cursor-pointer hover:bg-primary-hover">Atualizar</button>
</div>
<div class="flex flex-wrap gap-2 text-xs text-slate-600">
<span class="font-semibold mr-1">Perfis adicionais:</span>
{% for valor, label in perfis %}
{% if valor != usuario.perfil %}
<label class="inline-flex items-center gap-1">
<input type="checkbox"
name="perfis_extras"
value="{{ valor }}"
class="w-3.5 h-3.5 accent-primary"
{% if valor in item.perfis_extras %}checked{% endif %}>
<span>{{ label }}</span>
</label>
{% endif %}
{% endfor %}
</div>
</form>
</td>
<td class="p-3">
{% if usuario.perfil == 'HEAD' %}
<div class="mt-2 p-3 bg-slate-50 rounded-md border border-slate-200">
<form method="post">
{% csrf_token %}
<input type="hidden" name="gestores_head_id" value="{{ usuario.id }}">
<label for="gestores-{{ usuario.id }}" class="block text-sm text-slate-500 mb-1.5">Este Head aprova solicitações dos gestores:</label>
<select id="gestores-{{ usuario.id }}" name="gestores_ids" multiple class="min-w-[200px] min-h-[80px] py-1.5 px-2 border border-slate-200 rounded-md text-sm focus:outline-none focus:border-primary">
{% for g, selected in gestores_com_selecao %}
<option value="{{ g.id }}" {% if selected %}selected{% endif %}>{{ g.nome }} ({{ g.matricula }})</option>
{% endfor %}
</select>
<button type="submit" class="mt-2 py-1.5 px-3 bg-indigo-600 text-white border-0 rounded-md text-sm font-semibold cursor-pointer hover:bg-indigo-700">Salvar gestores</button>
</form>
</div>
{% else %}—{% endif %}
</td>
</tr>
{% endwith %}
{% empty %}
<tr>
<td colspan="6" class="text-center py-10 text-slate-500">Nenhum usuário encontrado.</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
{% if usuarios.has_other_pages %}
<div class="mt-5 flex items-center justify-center gap-2 flex-wrap">
{% if usuarios.has_previous %}
<a href="?page=1{% if busca %}&q={{ busca }}{% endif %}" class="py-2 px-3 no-underline border border-slate-200 rounded-md text-slate-600 bg-white hover:bg-slate-50 hover:border-primary transition-colors">« Primeira</a>
<a href="?page={{ usuarios.previous_page_number }}{% if busca %}&q={{ busca }}{% endif %}" class="py-2 px-3 no-underline border border-slate-200 rounded-md text-slate-600 bg-white hover:bg-slate-50 hover:border-primary transition-colors"> Anterior</a>
{% endif %}
<span class="py-2 px-3 bg-primary text-white rounded-md">Página {{ usuarios.number }} de {{ usuarios.paginator.num_pages }}</span>
{% if usuarios.has_next %}
<a href="?page={{ usuarios.next_page_number }}{% if busca %}&q={{ busca }}{% endif %}" class="py-2 px-3 no-underline border border-slate-200 rounded-md text-slate-600 bg-white hover:bg-slate-50 hover:border-primary transition-colors">Próxima </a>
<a href="?page={{ usuarios.paginator.num_pages }}{% if busca %}&q={{ busca }}{% endif %}" class="py-2 px-3 no-underline border border-slate-200 rounded-md text-slate-600 bg-white hover:bg-slate-50 hover:border-primary transition-colors">Última »</a>
{% endif %}
</div>
{% endif %}
<div class="mt-8 p-4 bg-slate-50 rounded-lg border-l-4 border-primary">
<strong>💡 Dica:</strong> Você também pode gerenciar permissões pelo <a href="/admin/solicitacoes/usuariosistema/" class="text-primary font-semibold hover:underline">painel administrativo</a>.
</div>
{% endblock %}

View File

@ -0,0 +1,73 @@
{% extends "base.html" %}
{% block title %}Listar Colaboradores - SGMP{% endblock %}
{% block content %}
<div class="mb-6">
<h1 class="text-2xl font-bold text-slate-800 mb-2">Selecionar Colaborador</h1>
<p><a href="{% url 'solicitacoes:dashboard' %}" class="text-primary font-medium hover:underline">← Voltar ao Dashboard</a></p>
</div>
<div class="bg-white p-5 rounded-lg shadow border border-slate-200 mb-5">
<form method="get" class="flex flex-wrap gap-3">
<input type="text" name="q" value="{{ busca }}" placeholder="Buscar por nome ou matrícula..." class="flex-1 min-w-[200px] py-2 px-3 border border-slate-200 rounded-md focus:outline-none focus:border-primary focus:ring-2 focus:ring-primary/20">
{% if tipo == 'substituicao' %}<input type="hidden" name="tipo" value="substituicao">{% endif %}
<button type="submit" class="py-2 px-4 bg-primary text-white rounded-md font-semibold hover:bg-primary-hover transition-colors">Buscar</button>
{% if busca %}<a href="{% url 'solicitacoes:listar_colaboradores' %}{% if tipo == 'substituicao' %}?tipo=substituicao{% endif %}" class="py-2 px-4 bg-slate-500 text-white no-underline rounded-md inline-block hover:bg-slate-600 transition-colors">Limpar</a>{% endif %}
</form>
{% if apenas_desligados %}
<div class="mt-3 p-3 bg-amber-50 border border-amber-300 rounded-md text-amber-800 text-sm">
<strong> Informação:</strong> Mostrando apenas colaboradores <strong>DESLIGADOS</strong> (útil para admissão por substituição).
</div>
{% endif %}
</div>
<div class="bg-white rounded-lg shadow border border-slate-200 overflow-hidden">
<table class="w-full border-collapse">
<thead>
<tr>
<th class="p-3 text-left border-b border-slate-200 bg-slate-50 font-semibold text-slate-600">Matrícula</th>
<th class="p-3 text-left border-b border-slate-200 bg-slate-50 font-semibold text-slate-600">Nome</th>
<th class="p-3 text-left border-b border-slate-200 bg-slate-50 font-semibold text-slate-600">Cargo</th>
<th class="p-3 text-left border-b border-slate-200 bg-slate-50 font-semibold text-slate-600">Setor</th>
<th class="p-3 text-left border-b border-slate-200 bg-slate-50 font-semibold text-slate-600">Centro de Custo</th>
<th class="p-3 text-left border-b border-slate-200 bg-slate-50 font-semibold text-slate-600">Ações</th>
</tr>
</thead>
<tbody>
{% for colaborador in colaboradores %}
<tr class="border-b border-slate-200 hover:bg-slate-50">
<td class="p-3 text-slate-800">{{ colaborador.matricula }}</td>
<td class="p-3 text-slate-800">{{ colaborador.nome }}</td>
<td class="p-3 text-slate-800">{{ colaborador.cargo }}</td>
<td class="p-3 text-slate-800">{{ colaborador.setor }}</td>
<td class="p-3 text-slate-800">{{ colaborador.centro_custo }}</td>
<td class="p-3 whitespace-nowrap">
<a href="{% url 'solicitacoes:criar_desligamento' colaborador.id %}" class="mr-2 py-1.5 px-2.5 no-underline bg-primary text-white rounded text-sm hover:bg-primary-hover transition-colors">Desligamento</a>
<a href="{% url 'solicitacoes:criar_movimentacao' colaborador.id %}" class="mr-2 py-1.5 px-2.5 no-underline bg-primary text-white rounded text-sm hover:bg-primary-hover transition-colors">Movimentação</a>
<a href="{% url 'solicitacoes:criar_admissao_substituicao' colaborador.id %}" class="py-1.5 px-2.5 no-underline bg-primary text-white rounded text-sm hover:bg-primary-hover transition-colors">Substituição</a>
</td>
</tr>
{% empty %}
<tr>
<td colspan="6" class="p-6 text-center text-slate-500">Nenhum colaborador encontrado.</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
{% if colaboradores.has_other_pages %}
<div class="mt-5 flex items-center justify-center gap-2 flex-wrap">
{% if colaboradores.has_previous %}
<a href="?page=1{% if busca %}&q={{ busca }}{% endif %}{% if tipo == 'substituicao' %}&tipo=substituicao{% endif %}" class="py-2 px-3 no-underline border border-slate-200 rounded-md text-slate-600 bg-white hover:bg-slate-50 hover:border-primary">« Primeira</a>
<a href="?page={{ colaboradores.previous_page_number }}{% if busca %}&q={{ busca }}{% endif %}{% if tipo == 'substituicao' %}&tipo=substituicao{% endif %}" class="py-2 px-3 no-underline border border-slate-200 rounded-md text-slate-600 bg-white hover:bg-slate-50 hover:border-primary"> Anterior</a>
{% endif %}
<span class="py-2 px-3 bg-primary text-white rounded-md">Página {{ colaboradores.number }} de {{ colaboradores.paginator.num_pages }}</span>
{% if colaboradores.has_next %}
<a href="?page={{ colaboradores.next_page_number }}{% if busca %}&q={{ busca }}{% endif %}{% if tipo == 'substituicao' %}&tipo=substituicao{% endif %}" class="py-2 px-3 no-underline border border-slate-200 rounded-md text-slate-600 bg-white hover:bg-slate-50 hover:border-primary">Próxima </a>
<a href="?page={{ colaboradores.paginator.num_pages }}{% if busca %}&q={{ busca }}{% endif %}{% if tipo == 'substituicao' %}&tipo=substituicao{% endif %}" class="py-2 px-3 no-underline border border-slate-200 rounded-md text-slate-600 bg-white hover:bg-slate-50 hover:border-primary">Última »</a>
{% endif %}
</div>
{% endif %}
{% endblock %}

View File

@ -0,0 +1,97 @@
{% extends "base.html" %}
{% block title %}Criar Solicitação de Movimentação - SGMP{% endblock %}
{% block css %}
<style>
.conditional-fields { display: none; }
.conditional-fields.active { display: block; }
</style>
{% endblock %}
{% block content %}
<div class="bg-white border border-slate-200 rounded-lg p-6 max-w-3xl mx-auto">
<div class="mb-6 pb-4 border-b border-slate-200">
<h2 class="text-xl font-semibold text-slate-700 m-0">Criar Solicitação de Movimentação</h2>
</div>
{% if messages %}
<div class="mb-6">
<ul class="list-none p-0 m-0 space-y-2">
{% for message in messages %}
<li class="py-3 px-4 rounded-lg text-sm {% if message.tags == 'error' %}bg-red-100 text-red-800 border border-red-200{% elif message.tags == 'success' %}bg-emerald-100 text-emerald-800 border border-emerald-200{% else %}bg-blue-100 text-blue-800 border border-blue-200{% endif %}">{{ message }}</li>
{% endfor %}
</ul>
</div>
{% endif %}
<div class="bg-slate-50 border border-slate-200 border-l-4 border-l-primary rounded-lg p-5 mb-6">
<h3 class="text-base font-semibold text-slate-700 m-0 mb-4">Dados do Colaborador</h3>
<div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-3">
<div><span class="block text-sm text-slate-500 font-medium">Nome</span><span class="text-slate-700 font-medium">{{ funcionario.nome }}</span></div>
<div><span class="block text-sm text-slate-500 font-medium">Matrícula</span><span class="text-slate-700 font-medium">{{ funcionario.matricula }}</span></div>
<div><span class="block text-sm text-slate-500 font-medium">Cargo Atual</span><span class="text-slate-700 font-medium">{{ funcionario.cargo|default:"N/A" }}</span></div>
<div><span class="block text-sm text-slate-500 font-medium">Setor Atual</span><span class="text-slate-700 font-medium">{{ funcionario.setor|default:"N/A" }}</span></div>
<div><span class="block text-sm text-slate-500 font-medium">Centro de Custo Atual</span><span class="text-slate-700 font-medium">{{ funcionario.centro_custo|default:"N/A" }}</span></div>
<div><span class="block text-sm text-slate-500 font-medium">Salário Atual</span><span class="text-slate-700 font-medium">R$ {{ funcionario.salario|default:"N/A" }}</span></div>
</div>
</div>
<form method="post">
{% csrf_token %}
<div class="grid grid-cols-1 md:grid-cols-2 gap-5">
<div class="md:col-span-2">
<div class="flex items-center gap-3 p-3 bg-slate-50 border border-slate-200 rounded-lg">
<input type="checkbox" name="altera_funcao" id="altera_funcao" class="w-[18px] h-[18px] cursor-pointer accent-primary">
<label for="altera_funcao" class="text-slate-700 font-medium cursor-pointer m-0">Alterar Função/Cargo</label>
</div>
<div id="campos_funcao" class="conditional-fields mt-2 p-4 bg-slate-50 border border-slate-200 rounded-lg">
<label for="novo_cod_funcao" class="block text-sm font-medium text-slate-700 mb-1">Nova Função/Cargo</label>
<select name="novo_cod_funcao" id="novo_cod_funcao" class="w-full py-2.5 px-4 border border-slate-200 rounded-lg text-base focus:outline-none focus:border-primary focus:ring-2 focus:ring-primary/20">
<option value="">Selecione um cargo...</option>
{% for cargo in cargos %}<option value="{{ cargo.codigo }}">{{ cargo.nome }}</option>{% endfor %}
</select>
</div>
</div>
<div class="md:col-span-2">
<div class="flex items-center gap-3 p-3 bg-slate-50 border border-slate-200 rounded-lg">
<input type="checkbox" name="altera_centro_custo" id="altera_centro_custo" class="w-[18px] h-[18px] cursor-pointer accent-primary">
<label for="altera_centro_custo" class="text-slate-700 font-medium cursor-pointer m-0">Alterar Centro de Custo/Setor</label>
</div>
<div id="campos_centro_custo" class="conditional-fields mt-2 p-4 bg-slate-50 border border-slate-200 rounded-lg">
<label for="novo_cod_secao" class="block text-sm font-medium text-slate-700 mb-1">Nova Seção/Centro de Custo</label>
<select name="novo_cod_secao" id="novo_cod_secao" class="w-full py-2.5 px-4 border border-slate-200 rounded-lg text-base focus:outline-none focus:border-primary focus:ring-2 focus:ring-primary/20">
<option value="">Selecione uma seção...</option>
{% for secao in secoes %}<option value="{{ secao.codigo }}">{{ secao.descricao }}</option>{% endfor %}
</select>
</div>
</div>
<div>
<label for="novo_salario" class="block text-sm font-medium text-slate-700 mb-1">Novo Salário (opcional)</label>
<input type="number" name="novo_salario" id="novo_salario" step="0.01" min="0" placeholder="0.00" class="w-full py-2.5 px-4 border border-slate-200 rounded-lg text-base focus:outline-none focus:border-primary focus:ring-2 focus:ring-primary/20">
</div>
<div>
<label for="data_efetivacao" class="block text-sm font-medium text-slate-700 mb-1">Data de Efetivação *</label>
<input type="date" name="data_efetivacao" id="data_efetivacao" class="w-full py-2.5 px-4 border border-slate-200 rounded-lg text-base focus:outline-none focus:border-primary focus:ring-2 focus:ring-primary/20" required>
</div>
<div class="md:col-span-2">
<label for="justificativa" class="block text-sm font-medium text-slate-700 mb-1">Justificativa *</label>
<textarea name="justificativa" id="justificativa" required placeholder="Descreva o motivo da movimentação..." class="w-full py-2.5 px-4 border border-slate-200 rounded-lg text-base min-h-[120px] resize-y focus:outline-none focus:border-primary focus:ring-2 focus:ring-primary/20"></textarea>
</div>
</div>
<div class="mt-6 pt-6 border-t border-slate-200 flex flex-wrap gap-3">
<button type="submit" class="py-2.5 px-5 bg-primary text-white border-0 rounded-lg font-medium cursor-pointer hover:bg-primary-hover transition-colors">Criar Solicitação</button>
<a href="{% url 'solicitacoes:listar_colaboradores' %}" class="py-2.5 px-5 bg-slate-500 text-white no-underline rounded-lg font-medium inline-block hover:bg-slate-600 transition-colors">Cancelar</a>
</div>
</form>
</div>
<script>
document.getElementById('altera_funcao').addEventListener('change', function() {
document.getElementById('campos_funcao').classList.toggle('active', this.checked);
});
document.getElementById('altera_centro_custo').addEventListener('change', function() {
document.getElementById('campos_centro_custo').classList.toggle('active', this.checked);
});
</script>
{% endblock %}

View File

@ -0,0 +1,333 @@
{% extends "base.html" %}
{% block title %}Detalhe #{{ solicitacao.id }} - SGMP{% endblock %}
{% block css %}
<style>
.status-RASCUNHO { background: #fffbeb; color: #b45309; border: 1px solid #fcd34d; }
.status-AGUARDANDO_HEAD { background: #fef3c7; color: #b45309; border: 1px solid #fcd34d; }
.status-ENVIADA { background: #eff6ff; color: #1d4ed8; border: 1px solid #bfdbfe; }
.status-APROVADA_GG, .status-APROVADA_CONTROLADORIA, .status-APROVADA_DIRETORIA { background: #ecfdf5; color: #047857; border: 1px solid #6ee7b7; }
.status-AGUARDANDO_DIRETORIA { background: #fef3c7; color: #b45309; border: 1px solid #fcd34d; }
.status-FINALIZADA { background: #f3f4f6; color: #374151; border: 1px solid #d1d5db; }
.status-REPROVADA { background: #fef2f2; color: #b91c1c; border: 1px solid #fecaca; }
.timeline { position: relative; padding-left: 2rem; border-left: 2px solid #e2e8f0; margin-left: 10px; }
.timeline-item { position: relative; padding-bottom: 2rem; }
.timeline-item:last-child { padding-bottom: 0; }
.timeline-marker { position: absolute; left: -2.6rem; top: 0; width: 16px; height: 16px; border-radius: 50%; border: 3px solid white; box-shadow: 0 0 0 1px #e2e8f0; }
.marker-success { background: #10b981; }
.marker-danger { background: #ef4444; }
.parecer-card { background: #f8fafc; border: 1px solid #e2e8f0; border-radius: 8px; padding: 16px; margin-bottom: 12px; }
.parecer-gg { border-left: 4px solid #3b82f6; }
.parecer-fin { border-left: 4px solid #10b981; }
</style>
{% endblock %}
{% block content %}
<div class="max-w-4xl mx-auto pb-10">
<div class="flex flex-wrap justify-between items-start gap-4 mb-6">
<div>
<h1 class="text-2xl font-bold text-slate-800 tracking-tight m-0">Detalhe da Solicitação #{{ solicitacao.id }}</h1>
<div class="text-slate-500 text-sm mt-1">Criado em {{ solicitacao.criado_em|date:"d/m/Y H:i" }} por <strong>{{ solicitacao.solicitante.nome }}</strong></div>
<div class="inline-flex items-center py-1.5 px-3.5 rounded-full text-sm font-bold mt-2 status-badge status-{{ solicitacao.status }}">{{ solicitacao.get_status_display }}</div>
</div>
<a href="{% url 'solicitacoes:dashboard' %}" class="inline-flex items-center gap-1.5 py-2 px-3 rounded-md font-medium text-slate-600 bg-white border border-slate-200 no-underline hover:bg-slate-50 hover:text-slate-800 hover:border-slate-300 transition-colors"><span></span> Voltar ao Dashboard</a>
</div>
{% if messages %}
<div class="mb-5">
<ul class="list-none p-0 m-0 space-y-2">
{% for message in messages %}
<li class="py-3 px-4 rounded-lg flex items-center gap-2 text-sm {% if message.tags == 'error' %}bg-red-50 text-red-800 border border-red-200{% else %}bg-emerald-50 text-emerald-800 border border-emerald-200{% endif %}">{% if message.tags == 'error' %}⚠️{% else %}✅{% endif %} {{ message }}</li>
{% endfor %}
</ul>
</div>
{% endif %}
<div class="bg-white rounded-xl border border-slate-200 shadow-sm mb-6 overflow-hidden">
<div class="px-6 py-4 bg-slate-50 border-b border-slate-200 flex items-center gap-2">
<span>📄</span>
<h3 class="text-sm font-semibold text-slate-600 uppercase tracking-wider m-0">Dados Gerais</h3>
</div>
<div class="p-6">
<div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4">
<div class="flex flex-col">
<span class="text-xs font-semibold text-slate-500 uppercase mb-1">Tipo de Processo</span>
<span class="text-primary font-bold">{{ solicitacao.get_tipo_display }}</span>
</div>
<div class="flex flex-col">
<span class="text-xs font-semibold text-slate-500 uppercase mb-1">Solicitante</span>
<span class="text-slate-800 font-medium">{{ solicitacao.solicitante.nome }} <small class="text-slate-500">({{ solicitacao.solicitante.matricula }})</small></span>
</div>
<div class="flex flex-col">
<span class="text-xs font-semibold text-slate-500 uppercase mb-1">Enviada em</span>
<span class="text-slate-800 font-medium">{{ solicitacao.enviada_em|date:"d/m/Y H:i"|default:"-" }}</span>
</div>
{% if solicitacao.finalizada_em %}
<div class="flex flex-col">
<span class="text-xs font-semibold text-slate-500 uppercase mb-1">Finalizada em</span>
<span class="text-slate-800 font-medium">{{ solicitacao.finalizada_em|date:"d/m/Y H:i" }}</span>
</div>
{% endif %}
</div>
</div>
</div>
{% if solicitacao.funcionario %}
<div class="bg-white rounded-xl border border-slate-200 border-l-4 border-l-primary shadow-sm mb-6 overflow-hidden">
<div class="px-6 py-4 bg-blue-50 border-b border-slate-200 flex items-center gap-2">
<span>🏢</span>
<h3 class="text-sm font-semibold text-slate-600 uppercase tracking-wider m-0">Dados do Colaborador</h3>
<span class="bg-blue-100 text-blue-800 py-1 px-2.5 rounded-md text-xs font-bold">Integração TOTVS RM</span>
</div>
<div class="p-6">
<p class="-mt-1 mb-6 text-sm text-slate-500"> Snapshot dos dados no momento da criação da solicitação</p>
<div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4">
<div class="flex flex-col"><span class="text-xs font-semibold text-slate-500 uppercase mb-1">Matrícula</span><span class="text-slate-800 font-medium">{{ solicitacao.funcionario.matricula }}</span></div>
<div class="flex flex-col"><span class="text-xs font-semibold text-slate-500 uppercase mb-1">Nome Completo</span><span class="text-slate-800 font-medium font-bold">{{ solicitacao.funcionario.nome }}</span></div>
<div class="flex flex-col"><span class="text-xs font-semibold text-slate-500 uppercase mb-1">CPF</span><span class="text-slate-800 font-medium">{{ solicitacao.funcionario.cpf|default:"-" }}</span></div>
<div class="flex flex-col"><span class="text-xs font-semibold text-slate-500 uppercase mb-1">Data de Admissão</span><span class="text-slate-800 font-medium">{{ solicitacao.funcionario.data_admissao|date:"d/m/Y"|default:"-" }}</span></div>
</div>
<div class="border-t border-dashed border-slate-200 mt-6 pt-6">
<div class="text-slate-400 text-xs font-bold uppercase mb-4 flex items-center gap-2">💼 Dados Profissionais</div>
<div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4">
<div class="flex flex-col"><span class="text-xs font-semibold text-slate-500 uppercase mb-1">Cargo/Função</span><span class="text-slate-800 font-medium">{{ solicitacao.funcionario.cargo }}</span></div>
<div class="flex flex-col"><span class="text-xs font-semibold text-slate-500 uppercase mb-1">Cód. Função</span><span class="text-slate-800 font-medium">{{ solicitacao.funcionario.cod_funcao|default:"N/A" }}</span></div>
<div class="flex flex-col"><span class="text-xs font-semibold text-slate-500 uppercase mb-1">Setor/Seção</span><span class="text-slate-800 font-medium">{{ solicitacao.funcionario.setor }}</span></div>
<div class="flex flex-col"><span class="text-xs font-semibold text-slate-500 uppercase mb-1">Centro de Custo</span><span class="text-slate-800 font-medium">{{ solicitacao.funcionario.centro_custo }}</span></div>
{% if solicitacao.funcionario.salario %}
<div class="flex flex-col"><span class="text-xs font-semibold text-slate-500 uppercase mb-1">Salário Atual</span><span class="text-emerald-600 font-medium">R$ {{ solicitacao.funcionario.salario|floatformat:2 }}</span></div>
{% endif %}
</div>
</div>
{% if solicitacao.funcionario.saldo_banco_horas_minutos is not None %}
<div class="border-t border-dashed border-slate-200 mt-6 pt-6">
<div class="text-slate-400 text-xs font-bold uppercase mb-4 flex items-center gap-2">⏰ Banco de Horas</div>
<div class="grid grid-cols-1 sm:grid-cols-2 gap-4">
<div class="flex flex-col"><span class="text-xs font-semibold text-slate-500 uppercase mb-1">Saldo Atual</span><span class="text-slate-800 font-medium">{% if solicitacao.funcionario.saldo_banco_horas_minutos >= 0 %}<span class="text-emerald-600">+{{ solicitacao.funcionario.saldo_banco_horas_minutos }} min</span>{% else %}<span class="text-red-600">{{ solicitacao.funcionario.saldo_banco_horas_minutos }} min</span>{% endif %}</span></div>
{% if solicitacao.funcionario.inicio_periodo_banco_horas %}
<div class="flex flex-col"><span class="text-xs font-semibold text-slate-500 uppercase mb-1">Período Referência</span><span class="text-slate-800 font-medium">{{ solicitacao.funcionario.inicio_periodo_banco_horas|date:"d/m/Y" }} a {{ solicitacao.funcionario.fim_periodo_banco_horas|date:"d/m/Y" }}</span></div>
{% endif %}
</div>
</div>
{% endif %}
{% if solicitacao.funcionario.sincronizado_em %}
<div class="mt-6 pt-2 border-t border-slate-100 text-xs text-slate-400 text-right">Sincronizado com RM em: {{ solicitacao.funcionario.sincronizado_em|date:"d/m/Y H:i" }} | ID: {{ solicitacao.funcionario.id_rm }}</div>
{% endif %}
</div>
</div>
{% endif %}
{% if dados_winthor_organizados %}
<div class="bg-white rounded-xl border border-slate-200 border-l-4 border-l-primary shadow-sm mb-6 overflow-hidden">
<div class="px-6 py-4 bg-slate-50 border-b border-slate-200 flex items-center gap-2">
<span>💼</span>
<h3 class="text-sm font-semibold text-slate-600 uppercase tracking-wider m-0">Dados do Colaborador - Winthor</h3>
<span class="bg-blue-100 text-blue-800 py-1 px-2.5 rounded-md text-xs font-bold">Sistema Winthor</span>
</div>
<div class="p-6">
<div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4">
{% if dados_winthor_organizados.basicos %}
<div class="border-t border-dashed border-slate-200 mt-6 pt-6 col-span-full">
<div class="text-slate-400 text-xs font-bold uppercase mb-4 flex items-center gap-2">👤 Dados Básicos</div>
<div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4">
{% if dados_winthor_organizados.basicos.matricula %}<div class="flex flex-col"><span class="text-xs font-semibold text-slate-500 uppercase mb-1">Matrícula</span><span class="text-slate-800 font-medium font-bold">{{ dados_winthor_organizados.basicos.matricula }}</span></div>{% endif %}
{% if dados_winthor_organizados.basicos.nome %}<div class="flex flex-col"><span class="text-xs font-semibold text-slate-500 uppercase mb-1">Nome</span><span class="text-slate-800 font-medium font-bold">{{ dados_winthor_organizados.basicos.nome }}</span></div>{% endif %}
{% if dados_winthor_organizados.basicos.cpf %}<div class="flex flex-col"><span class="text-xs font-semibold text-slate-500 uppercase mb-1">CPF</span><span class="text-slate-800 font-medium">{{ dados_winthor_organizados.basicos.cpf }}</span></div>{% endif %}
</div>
</div>
{% endif %}
{% if dados_winthor_organizados.admissao %}
<div class="border-t border-dashed border-slate-200 mt-6 pt-6 col-span-full">
<div class="text-slate-400 text-xs font-bold uppercase mb-4 flex items-center gap-2">📅 Admissão e Situação</div>
<div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4">
{% if dados_winthor_organizados.admissao.admissao %}<div class="flex flex-col"><span class="text-xs font-semibold text-slate-500 uppercase mb-1">Data de Admissão</span><span class="text-slate-800 font-medium">{% if dados_winthor_organizados.admissao.admissao|date:"d/m/Y" %}{{ dados_winthor_organizados.admissao.admissao|date:"d/m/Y" }}{% else %}{{ dados_winthor_organizados.admissao.admissao }}{% endif %}</span></div>{% endif %}
{% if dados_winthor_organizados.admissao.situacao %}<div class="flex flex-col"><span class="text-xs font-semibold text-slate-500 uppercase mb-1">Situação</span><span class="text-slate-800 font-medium">{{ dados_winthor_organizados.admissao.situacao }}</span></div>{% endif %}
{% if dados_winthor_organizados.admissao.dt_exclusao %}<div class="flex flex-col"><span class="text-xs font-semibold text-slate-500 uppercase mb-1">Data de Exclusão</span><span class="text-slate-800 font-medium">{% if dados_winthor_organizados.admissao.dt_exclusao|date:"d/m/Y" %}{{ dados_winthor_organizados.admissao.dt_exclusao|date:"d/m/Y" }}{% else %}{{ dados_winthor_organizados.admissao.dt_exclusao }}{% endif %}</span></div>{% endif %}
</div>
</div>
{% endif %}
{% if dados_winthor_organizados.endereco %}
<div class="border-t border-dashed border-slate-200 mt-6 pt-6 col-span-full">
<div class="text-slate-400 text-xs font-bold uppercase mb-4 flex items-center gap-2">📍 Endereço</div>
<div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4">
{% if dados_winthor_organizados.endereco.endereco %}<div class="flex flex-col col-span-full"><span class="text-xs font-semibold text-slate-500 uppercase mb-1">Endereço</span><span class="text-slate-800 font-medium">{{ dados_winthor_organizados.endereco.endereco }}</span></div>{% endif %}
{% if dados_winthor_organizados.endereco.bairro %}<div class="flex flex-col"><span class="text-xs font-semibold text-slate-500 uppercase mb-1">Bairro</span><span class="text-slate-800 font-medium">{{ dados_winthor_organizados.endereco.bairro }}</span></div>{% endif %}
{% if dados_winthor_organizados.endereco.cidade %}<div class="flex flex-col"><span class="text-xs font-semibold text-slate-500 uppercase mb-1">Cidade</span><span class="text-slate-800 font-medium">{{ dados_winthor_organizados.endereco.cidade }}</span></div>{% endif %}
{% if dados_winthor_organizados.endereco.estado %}<div class="flex flex-col"><span class="text-xs font-semibold text-slate-500 uppercase mb-1">Estado</span><span class="text-slate-800 font-medium">{{ dados_winthor_organizados.endereco.estado }}</span></div>{% endif %}
</div>
</div>
{% endif %}
</div>
</div>
</div>
{% endif %}
<div class="bg-white rounded-xl border border-slate-200 shadow-sm mb-6 overflow-hidden">
<div class="px-6 py-4 bg-slate-50 border-b border-slate-200 flex items-center gap-2">
<span>📋</span>
<h3 class="text-sm font-semibold text-slate-600 uppercase tracking-wider m-0">Detalhes da Movimentação</h3>
</div>
<div class="p-6">
{% if solicitacao.tipo == 'DESLIGAMENTO' and solicitacao.desligamento %}
<div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4">
{% if solicitacao.desligamento.tipo_desligamento %}
<div class="flex flex-col">
<span class="text-xs font-semibold text-slate-500 uppercase mb-1">Tipo de Desligamento</span>
<span class="text-slate-800 font-medium">
{% if solicitacao.desligamento.tipo_desligamento == 'PEDIDO_DEMISSAO' %}
📝 Pedido de Demissão
{% elif solicitacao.desligamento.tipo_desligamento == 'SEM_JUSTA_CAUSA' %}
🚪 Demissão sem Justa Causa
{% elif solicitacao.desligamento.tipo_desligamento == 'COM_JUSTA_CAUSA' %}
⚠️ Demissão por Justa Causa
{% elif solicitacao.desligamento.tipo_desligamento == 'TERMINO_CONTRATO' %}
📅 Término de Contrato de Experiência
{% elif solicitacao.desligamento.tipo_desligamento == 'OUTROS' %}
📋 Outros
{% else %}
{{ solicitacao.desligamento.get_tipo_desligamento_display }}
{% endif %}
</span>
</div>
{% endif %}
{% if solicitacao.desligamento.aviso_previo %}
<div class="flex flex-col">
<span class="text-xs font-semibold text-slate-500 uppercase mb-1">Aviso Prévio</span>
<span class="text-slate-800 font-medium">
{% if solicitacao.desligamento.aviso_previo == 'TRABALHADO' %}
✅ Trabalhado
{% elif solicitacao.desligamento.aviso_previo == 'INDENIZADO' %}
💰 Indenizado (Dispensa imediata)
{% elif solicitacao.desligamento.aviso_previo == 'DISPENSADO' %}
📤 Dispensado (Pedido de demissão)
{% else %}
{{ solicitacao.desligamento.get_aviso_previo_display }}
{% endif %}
</span>
</div>
{% endif %}
<div class="flex flex-col"><span class="text-xs font-semibold text-slate-500 uppercase mb-1">Data Prevista de Saída</span><span class="text-slate-800 font-medium">{{ solicitacao.desligamento.data_prevista_desligamento|date:"d/m/Y" }}</span></div>
<div class="flex flex-col col-span-full"><span class="text-xs font-semibold text-slate-500 uppercase mb-1">Detalhamento / Justificativa</span><span class="text-slate-800 font-medium whitespace-pre-wrap">{{ solicitacao.desligamento.motivo }}</span></div>
{% if solicitacao.desligamento.arquivo_pedido %}
<div class="flex flex-col col-span-full"><span class="text-xs font-semibold text-slate-500 uppercase mb-1">Carta de Pedido de Demissão</span><span class="text-slate-800 font-medium"><a href="{{ solicitacao.desligamento.arquivo_pedido.url }}" target="_blank" class="text-primary no-underline inline-flex items-center gap-1">📎 <span>{{ solicitacao.desligamento.arquivo_pedido.name|slice:"20:" }}</span></a></span></div>
{% endif %}
{% if solicitacao.desligamento.observacoes %}
<div class="flex flex-col col-span-full"><span class="text-xs font-semibold text-slate-500 uppercase mb-1">Observações Adicionais</span><span class="text-slate-800 font-medium whitespace-pre-wrap">{{ solicitacao.desligamento.observacoes }}</span></div>
{% endif %}
</div>
{% elif solicitacao.tipo == 'MOVIMENTACAO' and solicitacao.movimentacao %}
<div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4">
{% if solicitacao.movimentacao.altera_funcao %}<div class="flex flex-col"><span class="text-xs font-semibold text-slate-500 uppercase mb-1">Nova Função</span><span class="text-slate-800 font-medium">{{ solicitacao.movimentacao.novo_cod_funcao }}</span></div>{% endif %}
{% if solicitacao.movimentacao.altera_centro_custo %}<div class="flex flex-col"><span class="text-xs font-semibold text-slate-500 uppercase mb-1">Nova Seção</span><span class="text-slate-800 font-medium">{{ solicitacao.movimentacao.novo_cod_secao }}</span></div>{% endif %}
{% if solicitacao.movimentacao.novo_salario %}<div class="flex flex-col"><span class="text-xs font-semibold text-slate-500 uppercase mb-1">Novo Salário</span><span class="text-slate-800 font-medium">R$ {{ solicitacao.movimentacao.novo_salario }}</span></div>{% endif %}
<div class="flex flex-col"><span class="text-xs font-semibold text-slate-500 uppercase mb-1">Data Efetivação</span><span class="text-slate-800 font-medium">{{ solicitacao.movimentacao.data_efetivacao|date:"d/m/Y" }}</span></div>
<div class="flex flex-col col-span-full"><span class="text-xs font-semibold text-slate-500 uppercase mb-1">Justificativa</span><span class="text-slate-800 font-medium">{{ solicitacao.movimentacao.justificativa }}</span></div>
</div>
{% elif solicitacao.tipo == 'ADM_SUBSTITUICAO' and solicitacao.admissao_substituicao %}
<div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4">
<div class="flex flex-col"><span class="text-xs font-semibold text-slate-500 uppercase mb-1">Data Prevista</span><span class="text-slate-800 font-medium">{{ solicitacao.admissao_substituicao.data_previsao_contratacao|date:"d/m/Y" }}</span></div>
<div class="flex flex-col"><span class="text-xs font-semibold text-slate-500 uppercase mb-1">Coligada/Filial Destino</span><span class="text-slate-800 font-medium">{{ solicitacao.admissao_substituicao.cod_coligada_destino }} / {{ solicitacao.admissao_substituicao.cod_filial_destino }}</span></div>
<div class="flex flex-col"><span class="text-xs font-semibold text-slate-500 uppercase mb-1">Seção Destino</span><span class="text-slate-800 font-medium">{{ solicitacao.admissao_substituicao.cod_secao_destino }}</span></div>
<div class="flex flex-col"><span class="text-xs font-semibold text-slate-500 uppercase mb-1">Função Destino</span><span class="text-slate-800 font-medium">{{ solicitacao.admissao_substituicao.cod_funcao_destino }}</span></div>
<div class="flex flex-col col-span-full"><span class="text-xs font-semibold text-slate-500 uppercase mb-1">Justificativa</span><span class="text-slate-800 font-medium">{{ solicitacao.admissao_substituicao.justificativa }}</span></div>
</div>
{% elif solicitacao.tipo == 'ADM_AUMENTO' and solicitacao.admissao_aumento %}
<div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4">
<div class="flex flex-col"><span class="text-xs font-semibold text-slate-500 uppercase mb-1">Data Prevista</span><span class="text-slate-800 font-medium">{{ solicitacao.admissao_aumento.data_previsao_contratacao|date:"d/m/Y" }}</span></div>
<div class="flex flex-col"><span class="text-xs font-semibold text-slate-500 uppercase mb-1">Local Destino</span><span class="text-slate-800 font-medium">Col: {{ solicitacao.admissao_aumento.cod_coligada_destino }} | Fil: {{ solicitacao.admissao_aumento.cod_filial_destino }}</span></div>
<div class="flex flex-col col-span-full"><span class="text-xs font-semibold text-slate-500 uppercase mb-1">Justificativa Estratégica</span><span class="text-slate-800 font-medium">{{ solicitacao.admissao_aumento.justificativa_estrategica }}</span></div>
</div>
{% endif %}
</div>
</div>
<div class="mt-12 mb-8">
<h3 class="text-xl font-semibold text-slate-800 mb-1">📝 Pareceres Técnicos</h3>
<p class="text-slate-500 text-sm mb-6">Análises das áreas de suporte (Gente e Gestão & Controladoria).</p>
<div class="grid grid-cols-1 md:grid-cols-2 gap-6">
<div>
<h4 class="text-blue-600 font-semibold mb-4 flex items-center gap-1.5">👥 Gente e Gestão</h4>
{% if pareceres_gg %}
{% for parecer in pareceres_gg %}
<div class="parecer-card parecer-gg">
<div class="flex justify-between mb-1"><strong class="text-slate-800 text-sm">{{ parecer.usuario.nome }}</strong><small class="text-slate-500">{{ parecer.criado_em|date:"d/m H:i" }}</small></div>
<p class="m-0 text-slate-700 whitespace-pre-wrap text-sm">{{ parecer.texto }}</p>
{% if parecer.anexo %}<a href="{{ parecer.anexo.url }}" target="_blank" class="inline-block mt-2 text-blue-600 no-underline text-sm">📎 Ver Anexo</a>{% endif %}
</div>
{% endfor %}
{% else %}
<div class="bg-slate-100 p-3 rounded-md text-slate-500 text-sm italic">Aguardando parecer de GG...</div>
{% endif %}
</div>
<div>
<h4 class="text-emerald-600 font-semibold mb-4 flex items-center gap-1.5">💰 Controladoria</h4>
{% if pareceres_controladoria %}
{% for parecer in pareceres_controladoria %}
<div class="parecer-card parecer-fin">
<div class="flex justify-between mb-1"><strong class="text-slate-800 text-sm">{{ parecer.usuario.nome }}</strong><small class="text-slate-500">{{ parecer.criado_em|date:"d/m H:i" }}</small></div>
<p class="m-0 text-slate-700 whitespace-pre-wrap text-sm">{{ parecer.texto }}</p>
{% if parecer.anexo %}<a href="{{ parecer.anexo.url }}" target="_blank" class="inline-block mt-2 text-emerald-600 no-underline text-sm">📎 Ver Anexo</a>{% endif %}
</div>
{% endfor %}
{% else %}
<div class="bg-slate-100 p-3 rounded-md text-slate-500 text-sm italic">Aguardando parecer da Controladoria...</div>
{% endif %}
</div>
</div>
</div>
<div class="mt-12">
<h3 class="text-xl font-semibold text-slate-800 mb-6">⚖️ Histórico de Aprovações</h3>
<div class="timeline">
{% for aprovacao in solicitacao.aprovacoes.all %}
<div class="timeline-item">
<div class="timeline-marker {% if aprovacao.decisao == 'APROVADO' %}marker-success{% else %}marker-danger{% endif %}"></div>
<div class="bg-white border border-slate-200 p-3 rounded-lg">
<div class="flex justify-between items-center">
<span class="font-semibold text-slate-800">{% if aprovacao.decisao == 'APROVADO' %}<span class="text-emerald-600">✅ APROVADO</span>{% else %}<span class="text-red-500">❌ REPROVADO</span>{% endif %}</span>
<small class="text-slate-500">{{ aprovacao.decidido_em|date:"d/m/Y H:i" }}</small>
</div>
<div class="text-sm text-slate-500 mt-1">Por: <strong>{{ aprovacao.usuario.nome }}</strong> ({{ aprovacao.get_etapa_display }})</div>
{% if aprovacao.justificativa %}<div class="mt-2 bg-slate-50 p-2 rounded text-sm text-slate-700 italic">"{{ aprovacao.justificativa }}"</div>{% endif %}
</div>
</div>
{% empty %}
<p class="text-slate-500 italic -ml-2">Nenhuma decisão registrada ainda.</p>
{% endfor %}
</div>
</div>
{% if solicitacao.pode_enviar and is_solicitante %}
<div class="mt-8 p-6 bg-sky-50 border border-sky-200 rounded-xl text-center">
<h3 class="text-sky-800 font-semibold m-0">🚀 Enviar para Aprovação</h3>
<p class="text-sky-900 mb-5">Sua solicitação está em rascunho. Revise os dados e envie para iniciar o fluxo.</p>
<a href="{% url 'solicitacoes:enviar_solicitacao' solicitacao.id %}" class="inline-flex items-center gap-2 py-3 px-6 rounded-md font-semibold bg-primary text-white no-underline hover:bg-primary-hover transition-colors">Confirmar Envio</a>
</div>
{% endif %}
{% if pode_dar_parecer %}
<div class="mt-8 p-6 bg-white rounded-xl border border-slate-200 border-t-4 border-t-blue-500 shadow-sm">
<h3 class="text-blue-800 font-semibold m-0 mb-1">{% if usuario_sistema.perfil == 'GG' %}👥 Parecer de Gente e Gestão{% elif usuario_sistema.perfil == 'CONTROLADORIA' %}💰 Parecer de Controladoria{% else %}📝 Registrar Parecer{% endif %}</h3>
<p class="text-slate-500 text-sm mb-6">Preencha sua análise técnica abaixo para subsidiar a decisão da diretoria.</p>
<form method="post" action="{% url 'solicitacoes:registrar_parecer' solicitacao.id %}" enctype="multipart/form-data">
{% csrf_token %}
<div class="mb-4">
<label for="texto" class="block mb-1 font-semibold text-slate-700">Parecer Técnico <span class="text-red-500">*</span></label>
<textarea name="texto" id="texto" rows="6" class="w-full py-2.5 px-3 border border-slate-200 rounded-md text-base focus:outline-none focus:border-primary focus:ring-2 focus:ring-primary/20" required placeholder="Descreva sua análise detalhada..."></textarea>
</div>
<div class="mb-5">
<label for="anexo" class="block mb-1 font-semibold text-slate-700">Anexo (Opcional)</label>
<input type="file" name="anexo" id="anexo" class="w-full py-2 px-3 border border-slate-200 rounded-md focus:outline-none focus:border-primary" accept=".pdf,.doc,.docx,.xls,.xlsx,.jpg,.png">
</div>
<button type="submit" class="py-2.5 px-5 rounded-md font-semibold bg-primary text-white border-0 cursor-pointer hover:bg-primary-hover transition-colors">💾 Salvar Parecer</button>
</form>
</div>
{% endif %}
</div>
{% endblock %}

View File

@ -0,0 +1,150 @@
{% extends "base.html" %}
{% block title %}Todas as Solicitações - SGMP{% endblock %}
{% block css %}
<style>
.filter-pill.active { background-color: #2563eb; color: white; border-color: #2563eb; font-weight: 600; }
.custom-table { table-layout: fixed; }
.custom-table th:nth-child(1) { width: 18%; } .custom-table th:nth-child(2), .custom-table th:nth-child(3) { width: 18%; }
.custom-table th:nth-child(4), .custom-table th:nth-child(5) { width: 12%; } .custom-table th:nth-child(6) { width: 22%; }
.status-RASCUNHO { background: #f3f4f6; color: #4b5563; }
.status-AGUARDANDO_HEAD { background: #fefce8; color: #a16207; }
.status-ENVIADA { background: #eff6ff; color: #1d4ed8; }
.status-APROVADA_GG, .status-APROVADA_CONTROLADORIA { background: #f0fdf4; color: #15803d; }
.status-AGUARDANDO_DIRETORIA { background: #fefce8; color: #a16207; }
.status-FINALIZADA, .status-APROVADA_DIRETORIA { background: #ecfdf5; color: #047857; }
.status-REPROVADA { background: #fef2f2; color: #b91c1c; }
#no-results-message { display: none; }
</style>
{% endblock %}
{% block content %}
<div class="page-header mb-6">
<h1 class="text-2xl font-bold text-slate-800 mb-1">Todas as Solicitações</h1>
<p class="text-slate-500 text-base max-w-xl">Acompanhe, filtre e analise todas as solicitações do sistema de forma rápida e centralizada.</p>
</div>
<div class="control-panel bg-white p-4 md:p-6 rounded-lg shadow border border-slate-200 mb-8">
<div class="filters-header flex flex-wrap justify-between items-center gap-4 mb-4">
<h2 class="text-base font-semibold text-slate-800 m-0">Filtros</h2>
<div class="search-box relative min-w-[280px]">
<svg class="absolute left-3 top-1/2 -translate-y-1/2 w-[18px] h-[18px] text-slate-500" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" d="M21 21l-5.197-5.197m0 0A7.5 7.5 0 105.196 5.196a7.5 7.5 0 0010.607 10.607z" /></svg>
<input type="text" id="searchInput" class="search-input w-full py-2.5 pl-10 pr-3 border border-slate-200 rounded-md text-sm focus:outline-none focus:border-primary focus:ring-2 focus:ring-primary/20" placeholder="Pesquisar por nome, tipo ou ID...">
</div>
</div>
<div class="filter-pills flex flex-wrap gap-2 border-t border-slate-200 pt-4">
<button type="button" class="filter-pill active px-3 py-1.5 rounded-full text-xs font-medium border border-slate-200 text-slate-500 hover:bg-slate-100 hover:border-slate-300 hover:text-slate-800 transition-colors cursor-pointer" data-status="todos">Todos</button>
{% for valor, label in status_choices %}
<button type="button" class="filter-pill px-3 py-1.5 rounded-full text-xs font-medium border border-slate-200 text-slate-500 hover:bg-slate-100 hover:border-slate-300 hover:text-slate-800 transition-colors cursor-pointer" data-status="{{ valor }}">{{ label }}</button>
{% endfor %}
<button type="button" id="clearFilters" class="clear-filters bg-transparent border-none text-primary font-medium cursor-pointer text-sm py-1 px-1 hover:underline">Limpar Filtros</button>
</div>
</div>
{% if solicitacoes %}
<div class="table-container bg-white rounded-lg shadow border border-slate-200 overflow-x-auto max-w-full">
<table class="custom-table w-full min-w-0 border-collapse">
<thead>
<tr>
<th class="p-3 md:p-3.5 text-left border-b border-slate-200 bg-slate-50 font-semibold text-slate-600 text-xs uppercase tracking-wider">Tipo da Solicitação</th>
<th class="p-3 md:p-3.5 text-left border-b border-slate-200 bg-slate-50 font-semibold text-slate-600 text-xs uppercase tracking-wider">Colaborador</th>
<th class="p-3 md:p-3.5 text-left border-b border-slate-200 bg-slate-50 font-semibold text-slate-600 text-xs uppercase tracking-wider">Solicitante</th>
<th class="p-3 md:p-3.5 text-left border-b border-slate-200 bg-slate-50 font-semibold text-slate-600 text-xs uppercase tracking-wider">Status</th>
<th class="p-3 md:p-3.5 text-left border-b border-slate-200 bg-slate-50 font-semibold text-slate-600 text-xs uppercase tracking-wider">Data</th>
<th class="p-3 md:p-3.5 text-left border-b border-slate-200 bg-slate-50"></th>
</tr>
</thead>
<tbody id="solicitacoesTbody">
{% for item in solicitacoes_com_acao %}
{% with solicitacao=item.solicitacao %}
<tr class="solicitacao-row border-b border-slate-200 hover:bg-slate-50/50 align-middle"
data-status="{{ solicitacao.status }}"
data-search-term="{{ solicitacao.get_tipo_display|lower }} {{ solicitacao.funcionario.nome|default:''|lower }} {{ solicitacao.solicitante.nome|lower }} #{{ solicitacao.id }}">
<td class="p-3 md:p-3.5 text-left align-middle break-words">
<div class="flex items-center gap-2 min-w-0">
<div class="flex-1 min-w-0">
<strong class="text-slate-800">{{ solicitacao.get_tipo_display }}</strong>
<span class="meta-info block text-xs text-slate-500 mt-0.5">#{{ solicitacao.id }}</span>
</div>
</div>
</td>
<td class="p-3 md:p-3.5 text-left align-middle break-words">
<strong>{% if solicitacao.funcionario %}{{ solicitacao.funcionario.nome }}{% else %}<span class="text-slate-400">N/A</span>{% endif %}</strong>
{% if solicitacao.funcionario and solicitacao.funcionario.chapa %}<span class="meta-info block text-xs text-slate-500">Chapa: {{ solicitacao.funcionario.chapa }}</span>{% endif %}
</td>
<td class="p-3 md:p-3.5 text-left align-middle break-words">
<strong class="text-slate-800">{{ solicitacao.solicitante.nome }}</strong>
<span class="meta-info block text-xs text-slate-500">{{ solicitacao.solicitante.setor|default:"Sem setor" }}</span>
</td>
<td class="p-3 md:p-3.5 text-left align-middle">
<span class="status-badge inline-flex items-center gap-1 py-1 px-2.5 rounded-full text-xs font-semibold status-{{ solicitacao.status }}">{{ solicitacao.get_status_display }}</span>
</td>
<td class="p-3 md:p-3.5 text-left align-middle text-xs text-slate-500"><span class="meta-info">{{ solicitacao.criado_em|timesince }} atrás</span></td>
<td class="p-3 md:p-3.5 text-left align-middle">
<a href="{% url 'solicitacoes:solicitacao_detalhe' solicitacao.id %}" class="btn-action inline-flex items-center gap-1 py-2 px-4 rounded-md text-sm font-semibold no-underline bg-primary text-white border border-primary hover:bg-primary-hover transition-colors whitespace-nowrap">Analisar ◹</a>
</td>
</tr>
{% endwith %}
{% endfor %}
</tbody>
</table>
<div id="no-results-message" class="empty-state text-center py-12 px-6 text-slate-500 bg-white border-2 border-dashed border-slate-200 rounded-lg m-4">
Nenhuma solicitação encontrada com os filtros aplicados.
</div>
</div>
{% if solicitacoes.has_other_pages %}
<div class="pagination mt-6 flex justify-center gap-2"></div>
{% endif %}
{% else %}
<div class="empty-state text-center py-12 px-6 text-slate-500 bg-white rounded-xl border-2 border-dashed border-slate-200">
Nenhuma solicitação encontrada no sistema.
</div>
{% endif %}
{% endblock %}
{% block scripts %}
{{ block.super }}
<script>
document.addEventListener('DOMContentLoaded', function() {
const searchInput = document.getElementById('searchInput');
const filterPills = document.querySelectorAll('.filter-pill');
const clearButton = document.getElementById('clearFilters');
const tableBody = document.getElementById('solicitacoesTbody');
if (!tableBody) return;
const rows = tableBody.getElementsByClassName('solicitacao-row');
const noResultsMessage = document.getElementById('no-results-message');
let currentStatusFilter = 'todos';
let currentSearchTerm = '';
function applyFilters() {
let visibleRows = 0;
for (let i = 0; i < rows.length; i++) {
const row = rows[i];
const statusMatch = (currentStatusFilter === 'todos' || row.dataset.status === currentStatusFilter);
const searchMatch = (row.dataset.searchTerm || '').toLowerCase().includes(currentSearchTerm);
if (statusMatch && searchMatch) { row.style.display = ''; visibleRows++; } else { row.style.display = 'none'; }
}
if (noResultsMessage) noResultsMessage.style.display = visibleRows === 0 ? 'block' : 'none';
}
if (searchInput) searchInput.addEventListener('input', function() { currentSearchTerm = searchInput.value.toLowerCase().trim(); applyFilters(); });
filterPills.forEach(pill => {
pill.addEventListener('click', function() {
if (!this.classList.contains('filter-pill')) return;
filterPills.forEach(p => p.classList.remove('active'));
this.classList.add('active');
currentStatusFilter = this.dataset.status || 'todos';
applyFilters();
});
});
if (clearButton) clearButton.addEventListener('click', function() {
if (searchInput) searchInput.value = '';
currentSearchTerm = '';
filterPills.forEach(p => p.classList.remove('active'));
const todosBtn = document.querySelector('.filter-pill[data-status="todos"]');
if (todosBtn) todosBtn.classList.add('active');
currentStatusFilter = 'todos';
applyFilters();
});
});
</script>
{% endblock %}