Importa código existente do SGMP_PROD
This commit is contained in:
commit
e34e85f382
|
|
@ -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
|
||||
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
||||
|
|
@ -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"]
|
||||
|
||||
|
|
@ -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
|
||||
|
||||
|
|
@ -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,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()
|
||||
|
|
@ -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)
|
||||
|
|
@ -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/"
|
||||
|
|
@ -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",
|
||||
},
|
||||
}
|
||||
|
|
@ -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/"
|
||||
|
|
@ -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:",
|
||||
}
|
||||
}
|
||||
|
|
@ -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)
|
||||
|
|
@ -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()
|
||||
|
|
@ -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
|
||||
|
||||
|
|
@ -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”.
|
||||
|
|
@ -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 "$@"
|
||||
|
||||
|
|
@ -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()
|
||||
|
|
@ -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
|
||||
|
|
@ -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,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",)
|
||||
}),
|
||||
)
|
||||
|
||||
|
|
@ -0,0 +1,6 @@
|
|||
from django.apps import AppConfig
|
||||
|
||||
|
||||
class SolicitacoesConfig(AppConfig):
|
||||
default_auto_field = 'django.db.models.BigAutoField'
|
||||
name = 'solicitacoes'
|
||||
|
|
@ -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}
|
||||
|
||||
|
|
@ -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
|
||||
|
||||
|
|
@ -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
|
||||
|
||||
|
|
@ -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))
|
||||
|
||||
|
|
@ -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')},
|
||||
},
|
||||
),
|
||||
]
|
||||
|
|
@ -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),
|
||||
),
|
||||
]
|
||||
|
|
@ -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),
|
||||
),
|
||||
]
|
||||
|
|
@ -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')},
|
||||
},
|
||||
),
|
||||
]
|
||||
|
|
@ -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),
|
||||
),
|
||||
]
|
||||
|
|
@ -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,
|
||||
),
|
||||
),
|
||||
]
|
||||
|
|
@ -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"
|
||||
),
|
||||
),
|
||||
]
|
||||
|
|
@ -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",
|
||||
),
|
||||
),
|
||||
]
|
||||
|
|
@ -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 há
|
||||
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}"
|
||||
|
||||
|
|
@ -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 já 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; só 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
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
# Template tags do app solicitacoes
|
||||
|
||||
|
|
@ -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"
|
||||
|
||||
|
|
@ -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 já 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.")
|
||||
|
|
@ -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"),
|
||||
|
||||
]
|
||||
|
|
@ -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, 1–13)
|
||||
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,
|
||||
})
|
||||
|
|
@ -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 %}
|
||||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -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 %}
|
||||
{{ 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
|
|
@ -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 %}
|
||||
|
|
@ -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 %}
|
||||
|
|
@ -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 %}
|
||||
|
|
@ -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 %}
|
||||
|
|
@ -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 %}
|
||||
|
|
@ -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 %}
|
||||
|
|
@ -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 %}
|
||||
|
|
@ -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 %}
|
||||
Loading…
Reference in New Issue