Documentação Técnica: Inativação de Vínculos Antigos e Migração de Marcações
Resumo do Incidente
Marcações de ponto de colaboradores não estão sendo enviadas à Senior, embora constem registradas na plataforma Joinin. A causa-raiz é a coexistência de múltiplos vínculos empregatícios simultaneamente ativos (active = true e situation = true) para os mesmos usuários.
Como o vínculo antigo — que deveria ter sido inativado pela integração ao criar o novo — permanece ativo, o registro de ponto cai no vínculo/matrícula desatualizado. A integração rejeita essas marcações por inconsistência cadastral na Senior (matrícula inexistente ou pertencente a outro cadastro no sistema de destino).
Mapeamento e Validação TécnicaA análise cruzada entre os bancos de dados Joinin e Senior identificou 9 vínculos incorretos que precisam de saneamento e 15 marcações presas pendentes de migração:
| User ID | Vínculo Incorreto (Matrícula) | Vínculo ID | Marcações Pendentes | Vínculo ID Destino (Migração) | Situação Cadastral na Senior |
1307 |
27063 |
1303 |
11 | 1362 (Matrícula 27123) |
Matrícula excluída na Senior |
1504 |
27261 |
1505 |
4 | 1519 (Matrícula 27273) |
Matrícula reaproveitada por outro cadastro |
1243 |
27000 |
1239 |
0 | N/A | Matrícula excluída na Senior |
1259 |
27010 |
1254 |
0 | N/A | Matrícula excluída na Senior |
1259 |
27066 |
1306 |
0 | N/A | Matrícula excluída na Senior |
1298 |
27038 |
1295 |
0 | N/A | Matrícula excluída na Senior |
1298 |
27252 |
1502 |
0 | N/A | Matrícula reaproveitada por outro cadastro |
1106 |
105 |
— | 0 | N/A | Terceirizado (Usuário inativo no Joinin, vínculo active=true) |
1106 |
108 |
— | 0 | N/A | Terceirizado (Usuário inativo no Joinin, vínculo active=true) |
Total de marcações afetadas: 15 marcações (todas com integration_situation = 1 - pendentes).
1. Identificação de usuários com múltiplos vínculos ativos
SELECT
u.id AS user_id,
u.active AS usuario_ativo,
count(er.id) AS qtd_vinculos,
count(*) FILTER (WHERE er.active AND er.situation) AS qtd_ativos_com_situacao,
bool_or(er.active) AS possui_algum_ativo,
string_agg(DISTINCT er.identification_number::text, ', ' ORDER BY er.identification_number::text) AS matriculas
FROM users u
JOIN employment_relationships er ON er.user_id = u.id
WHERE er.deleted_at IS NULL
GROUP BY u.id, u.active
HAVING
count(*) FILTER (WHERE er.active AND er.situation) > 1
OR bool_or(er.active) = false
ORDER BY possui_algum_ativo DESC, u.id;
2. Mapeamento das marcações presas por vínculo
WITH conta AS (
SELECT account_id FROM users WHERE id = 1504
),
vinculos_errados (user_id, matricula) AS (
VALUES
(1243, 27000),
(1259, 27010),
(1259, 27066),
(1307, 27063),
(1504, 27261),
(1298, 27038),
(1298, 27252)
),
vinculos_alvo AS (
SELECT er.*
FROM employment_relationships er
JOIN users u ON u.id = er.user_id
JOIN vinculos_errados ve ON ve.user_id = er.user_id AND ve.matricula = er.identification_number
WHERE u.account_id = (SELECT account_id FROM conta)
)
SELECT
v.identification_number AS matricula_errada,
v.id AS vinculo_id,
u.id AS user_id,
u.active AS usuario_ativo,
v.active AS vinculo_ativo,
(v.deleted_at IS NOT NULL) AS vinculo_soft_deleted,
count(ejr.id) AS qtd_marcacoes,
count(ejr.id) FILTER (WHERE ejr.integration_situation = 1) AS marcacoes_pendentes,
count(ejr.id) FILTER (WHERE ejr.integration_situation = 2) AS marcacoes_integradas,
min(ejr.record_hour) AS primeira_marcacao,
max(ejr.record_hour) AS ultima_marcacao
FROM vinculos_alvo v
JOIN users u ON u.id = v.user_id
LEFT JOIN employee_journey_records ejr
ON ejr.employment_relationship_id = v.id
AND ejr.deleted_at IS NULL
GROUP BY v.identification_number, v.id, u.id, u.active, v.active, v.deleted_at
ORDER BY qtd_marcacoes DESC;
Solicitado para Correção (Saneamento de Dados)
- Inativação de Vínculos: Inativar (
active = false) os 9 vínculos mapeados na tabela acima. - Migração de Marcações: Reassociar as 15 marcações pendentes (
integration_situation = 1) para seus respectivos vínculos vigentes/corretos:- Migrar 11 marcações do vínculo
1303para o vínculo1362. - Migrar 4 marcações do vínculo
1505para o vínculo1519.
- Migrar 11 marcações do vínculo
- Reprocessamento: Disparar o reprocessamento da integração das marcações atualizadas com a Senior.