Dicionário de Dados — Data Lake (BI)

Referência técnica das tabelas disponibilizadas no BigQuery para clientes com licença de BI.

Referência técnica completa das tabelas disponibilizadas no BigQuery para clientes com licença de BI.

Projeto: fnk-bi-{cliente} · Dataset: {company} · Convenção de nomes: {tabela}_{company}


1. Visão Geral da Arquitetura

O Data Lake segue uma estrutura de 3 camadas:

CamadaDescriçãoTabelas
Eventos (Fatos)Dados brutos coletados pelo agente desktop (agente desktop da Fhinck)events_{company}
Dimensões RelacionaisCadastros organizacionais — colaboradores, departamentos, cargos, regiões, domíniosrel_*, dim_employee_daily
OperacionaisRegistros de jornada, extensões, pontotime_tracking, time_extension_request
Tabelas de SuporteDescrição
network_raw_latestRedes corporativas (SSIDs)
text_clearing_rulesRegras de limpeza/anonimização de títulos
app_classificationV2Regras de classificação de aplicativos/sites

2. Tabela: events_{company}

Tabela principal de fatos. Contém todos os eventos brutos capturados pelo agente desktop nas máquinas dos colaboradores. Cada registro = uma janela (aplicativo) em foco por um período.

Particionamento: por coluna, em p2o_datetime_in (granularidade diária). Como o particionamento é por coluna, não existe a pseudo-coluna _PARTITIONDATE nesta tabela — filtre pela própria p2o_datetime_in.

Volume típico: milhares a milhões de registros/dia dependendo do número de colaboradores

Atualização: conforme licença contratada (diária ou intra-dia)

ColunaTipoDescrição
bigquery_idSTRINGID único do evento (PK)
p2o_usernameSTRINGEmail ou username do colaborador
p2o_hostnameSTRINGNome da máquina (hostname)
p2o_datetime_inTIMESTAMPInício do evento — momento em que a janela ganhou foco
p2o_datetime_outTIMESTAMPFim do evento — momento em que a janela perdeu foco
p2o_total_secondsFLOAT64Duração total do evento em segundos
p2o_total_idleFLOAT64Tempo ocioso (sem atividade de mouse/teclado) dentro do evento, em segundos
p2o_app_exeSTRINGNome do executável (ex: chrome.exe, excel.exe)
p2o_app_exe_fullnameSTRINGNome completo/descritivo do aplicativo
p2o_title_windowsSTRINGTítulo da janela ativa (pode conter nome do documento, aba do browser, etc.)
p2o_urlSTRINGURL completa (quando o aplicativo é um navegador)
p2o_url_domainSTRINGDomínio extraído da URL (ex: google.com)
p2o_networkSTRINGInformações de rede (SSID Wi-Fi conectado). Usado para detecção de local (escritório vs remoto)
p2o_mouse_hooksSTRINGDados de atividade do mouse (cliques, movimentos)
p2o_keyboard_hooksSTRINGDados de atividade do teclado (teclas pressionadas — sem captura de conteúdo)
p2o_IsWorkstationLockedBOOLEANSe a estação estava bloqueada (tela de login do Windows)
p2o_sourceSTRINGOrigem do dado (versão do agente, modo de envio)
p2o_datetime_last_insertTIMESTAMPTimestamp da última inserção/atualização deste registro no BigQuery
odd_behaviorSTRINGFlags de comportamento anômalo (ex: Invalid total_seconds, Corrupted File). Usado para filtragem de qualidade
Dica de uso: Ao consultar events, sempre filtre pela coluna de particionamento p2o_datetime_in para evitar full table scan e reduzir custos — por exemplo WHERE DATE(p2o_datetime_in) BETWEEN '2026-01-01' AND '2026-01-31'. Correção 2026-08-05: versões anteriores desta página indicavam _PARTITIONDATE; essa pseudo-coluna não existe em tabela particionada por coluna e a consulta falha com Unrecognized name: _PARTITIONDATE. Exclua registros com p2o_source = 'CORRUPTED' e odd_behavior contendo flags de erro.

3. Tabela: rel_department_hierarchy_{company}

Hierarquia de departamentos. Define a estrutura organizacional em níveis (1 = topo, N = mais específico).
ColunaTipoDescrição
department_nameSTRINGNome do departamento
department_codeSTRINGCódigo único do departamento (PK, usado como FK em outras tabelas)
creation_userSTRINGUsuário que criou o registro
creation_dateTIMESTAMPData de criação do registro
activeBOOLEANSe o departamento está ativo (filtrar TRUE para visão atual)
department_levelINT64Nível hierárquico: 1 = topo (diretoria), 2 = sub (gerência), 3+ = áreas específicas

4. Tabela: rel_role_attribute_{company}

Cadastro de cargos/funções. Tabela dimensional de referência para cargos dos colaboradores.
ColunaTipoDescrição
role_nameSTRINGNome do cargo
role_codeSTRINGCódigo único do cargo (PK)
creation_userSTRINGUsuário que criou o registro
creation_dateTIMESTAMPData de criação
activeBOOLEANSe o cargo está ativo

5. Tabela: rel_region_attribute_{company}

Cadastro de regiões/localidades. Dimensão geográfica dos colaboradores.
ColunaTipoDescrição
region_nameSTRINGNome da região
region_codeSTRINGCódigo único da região (PK)
creation_userSTRINGUsuário que criou o registro
creation_dateTIMESTAMPData de criação
activeBOOLEANSe a região está ativa

6. Tabela: rel_hierarchy_employee_associative_{company}

Vínculo colaborador × hierarquia organizacional. Tabela associativa que conecta cada colaborador ao seu departamento, cargo, região e processo. Contém também dados de jornada e férias.
Atenção: Esta tabela contém a configuração mais recente por login. Para análise histórica ("em qual depto o colaborador estava em data X"), use a tabela dim_employee_daily.
ColunaTipoDescrição
employeeSTRINGEmail/username do colaborador (PK principal, JOIN com events.p2o_username)
employee_aliasSTRINGNome de exibição do colaborador
fk_department_codeSTRINGFK → rel_department_hierarchy.department_code
fk_process_codeSTRINGCódigo do processo associado
fk_role_codeSTRINGFK → rel_role_attribute.role_code
fk_region_codeSTRINGFK → rel_region_attribute.region_code
department_pathSTRINGCaminho hierárquico completo (códigos separados por _). Ex: DIR_GER_AREA
process_pathSTRINGCaminho de processos (códigos separados por _)
vacation_activeBOOLEANSe o colaborador está em férias no momento
vacation_date_inTIMESTAMPData de início das férias
vacation_date_outTIMESTAMPData de fim das férias
Entry_WeekdaySTRINGHorário de entrada — dias úteis (ex: 08:00)
Exit_WeekdaySTRINGHorário de saída — dias úteis (ex: 18:00)
Entry_SaturdaySTRINGHorário de entrada — sábados
Exit_SaturdaySTRINGHorário de saída — sábados
Entry_SundaySTRINGHorário de entrada — domingos
Exit_SundaySTRINGHorário de saída — domingos
creation_userSTRINGUsuário que criou o registro
creation_dateTIMESTAMPData de criação
search_dateTIMESTAMPData de vigência da associação (snapshot temporal)
activeBOOLEANSe a associação está ativa

7. Tabela: rel_hierarchy_domain_associative_{company}

Classificação de domínios/aplicativos por contexto organizacional. Define se um domínio/app é produtivo, neutro ou improdutivo para cada combinação de departamento/cargo/região.
ColunaTipoDescrição
domainSTRINGDomínio ou nome do aplicativo
categorySTRINGCategoria do domínio/app
fk_department_codeSTRINGFK → departamento ao qual esta classificação se aplica
fk_process_codeSTRINGCódigo do processo
fk_role_codeSTRINGFK → cargo
fk_region_codeSTRINGFK → região
department_pathSTRINGCaminho hierárquico de departamento
process_pathSTRINGCaminho de processos
waterfall_classificationSTRINGClassificação de eficiência: produtivo, neutro, improdutivo
creation_userSTRINGUsuário que criou
creation_dateTIMESTAMPData de criação
search_dateTIMESTAMPData de vigência
activeBOOLEANSe a classificação está ativa
Nota: A classificação waterfall_classification é contextual — o mesmo domínio pode ser "produtivo" para um departamento e "neutro" para outro. Isso permite análises de eficiência operacional segmentadas.

8. Tabela: time_extension_request_{company}

Solicitações de extensão de jornada. Registra pedidos de hora extra feitos pelos colaboradores e sua aprovação/rejeição por gestores.
ColunaTipoDescrição
request_dateDATEData da solicitação
request_timestampTIMESTAMPMomento exato da solicitação
companySTRINGIdentificador da empresa
usernameSTRINGColaborador solicitante
time_requestedINT64Tempo extra solicitado (em minutos)
original_requestedINT64Valor originalmente solicitado (antes de ajustes)
justificationSTRINGJustificativa fornecida pelo colaborador
request_managerSTRINGGestor para quem a solicitação foi enviada
acceptedBOOLEANSe a solicitação foi aprovada (TRUE) ou rejeitada (FALSE)
accepted_timestampTIMESTAMPMomento da aprovação/rejeição
manager_acceptedSTRINGGestor que efetivamente aprovou/rejeitou
date_limitDATEData limite para a extensão ser utilizada
dh_insertTIMESTAMPData/hora de inserção no BigQuery

9. Tabela: time_tracking_{company}

Registros de ponto/jornada. Marcações de início e fim de jornada, incluindo intervalos de almoço.
ColunaTipoDescrição
action_dateDATEData do registro de ponto
action_idSTRINGID único da ação
usernameSTRINGColaborador
hostnameSTRINGMáquina de origem do registro
beginDayTIMESTAMPInício da jornada
beginLunchTIMESTAMPInício do intervalo de almoço
endLunchTIMESTAMPFim do intervalo de almoço
endDayTIMESTAMPFim da jornada
sourceSTRINGOrigem do registro: manual, sistema, etc.
locationTypeSTRINGTipo de local: escritório, home office, etc.
action_datetime_sentTIMESTAMPQuando o registro foi enviado pelo agente
action_datetime_bq_insertTIMESTAMPQuando o registro foi inserido no BigQuery
lastUpdateTIMESTAMPÚltima atualização do registro

10. Tabela: dim_employee_daily_{company}

Dimensão de colaborador por dia. Tabela desnormalizada com a "foto" organizacional de cada colaborador em cada data. Ideal para análises históricas — mostra em qual departamento/cargo/região o colaborador estava em cada dia.
Tabela recomendada para JOINs com events. Use employee = p2o_username e p2o_date = DATE(p2o_datetime_in) para enriquecer eventos com dados organizacionais históricos corretos.
ColunaTipoDescrição
employeeSTRINGEmail/username (lowercase)
p2o_dateDATEData de referência
employee_aliasSTRINGNome de exibição (uppercase)
role_nameSTRINGCargo vigente naquela data
RegionSTRINGRegião vigente naquela data
department_nameSTRINGDepartamento mais específico (nível mais profundo)
Department_1STRINGDepartamento nível 1 (topo — ex: Diretoria)
Department_2STRINGDepartamento nível 2 (ex: Gerência)
Department_3Department_10STRINGNíveis hierárquicos 3 a 10 (preenchidos conforme profundidade da estrutura do cliente)

11. Tabelas de Suporte

Disponibilidade. As três tabelas desta seção e as duas UDFs da seção 12 vivem no mesmo dataset do cliente e são pré-requisito da consulta de referência da especificação do Data Lake. Se a consulta retornar Not found: Table … network_raw_latest ou Function not found: clean_textV2, o ambiente ainda não recebeu essa camada — solicite o provisionamento pelo canal de atendimento; é uma operação aditiva, sem impacto nas tabelas existentes.

11.1 network_raw_latest

SSIDs de redes corporativas cadastradas. Usada para determinar se o colaborador está no escritório ou remoto.
ColunaTipoDescrição
DATASTRING (JSON)Documento JSON com $.network (array de SSIDs corporativos) e $.company

11.2 text_clearing_rules

Regras de limpeza e anonimização aplicadas aos títulos de janela antes da análise.
ColunaTipoDescrição
regex_ruleSTRINGExpressão regular para matching
replace_valueSTRINGValor de substituição
activeBOOLEANSe a regra está ativa
companySTRINGEmpresa ou GENERAL_ALL (regra global)

11.3 app_classificationV2

Regras de classificação de aplicativos e sites. Define nome, classe e prioridade para matching via regex.
ColunaTipoDescrição
companySTRINGEmpresa ou GENERAL_ALL
app_name_enSTRINGNome do aplicativo (inglês)
regex_ruleSTRINGRegex para matching em título/URL
app_regexSTRINGRegex adicional para matching no executável
app_classSTRINGClasse do app (ex: web_browser__class, office__class)
app_class_idINT64ID numérico da classe
rnkINT64Prioridade da regra (menor = mais prioritário)
activeBOOLEANSe a regra está ativa

12. UDFs (User Defined Functions)

Funções JavaScript disponíveis no BigQuery para processamento de dados:

FunçãoParâmetrosDescrição
clean_textV2(input, options, replacements)Limpeza e normalização de títulos de janela. Aplica regras de text_clearing_rules para anonimizar dados sensíveis
get_app_classification(rules, search_strings, app_web)Classificação de aplicativos. Recebe array de regras de app_classificationV2 e retorna nome/classe do app

13. Diagrama de Relacionamentos (ER)

Diagrama ER (Mermaid)
erDiagram
          events ||--o{ dim_employee_daily : "p2o_username = employee AND DATE(p2o_datetime_in) = p2o_date"
          events ||--o{ rel_hierarchy_employee_associative : "p2o_username = employee"
          rel_hierarchy_employee_associative }o--|| rel_department_hierarchy : "fk_department_code = department_code"
          rel_hierarchy_employee_associative }o--|| rel_role_attribute : "fk_role_code = role_code"
          rel_hierarchy_employee_associative }o--|| rel_region_attribute : "fk_region_code = region_code"
          rel_hierarchy_domain_associative }o--|| rel_department_hierarchy : "fk_department_code = department_code"
          time_tracking ||--o{ events : "username = p2o_username AND action_date = DATE(p2o_datetime_in)"
          time_extension_request ||--o{ events : "username = p2o_username"
      
          events {
              STRING bigquery_id PK
              STRING p2o_username
              TIMESTAMP p2o_datetime_in
              FLOAT64 p2o_total_seconds
              STRING p2o_app_exe
              STRING p2o_url_domain
          }
      
          dim_employee_daily {
              STRING employee PK
              DATE p2o_date PK
              STRING department_name
              STRING role_name
              STRING Region
          }
      
          rel_department_hierarchy {
              STRING department_code PK
              STRING department_name
              INT64 department_level
          }
      
          rel_role_attribute {
              STRING role_code PK
              STRING role_name
          }
      
          rel_region_attribute {
              STRING region_code PK
              STRING region_name
          }
      
          rel_hierarchy_employee_associative {
              STRING employee PK
              STRING fk_department_code FK
              STRING fk_role_code FK
              STRING fk_region_code FK
          }
      
          rel_hierarchy_domain_associative {
              STRING domain PK
              STRING fk_department_code FK
              STRING waterfall_classification
          }
      
          time_tracking {
              STRING action_id PK
              STRING username
              TIMESTAMP beginDay
              TIMESTAMP endDay
          }
      
          time_extension_request {
              STRING username
              DATE request_date
              BOOLEAN accepted
          }

14. Padrões de Consulta Recomendados

JOIN eventos + dimensão colaborador (histórico correto)

SQL
SELECT
        e.p2o_username,
        d.employee_alias,
        d.department_name,
        d.role_name,
        d.Region,
        SUM(e.p2o_total_seconds) AS total_seconds
      FROM `fnk-bi-empresa.empresa.events_empresa` e
      JOIN `fnk-bi-empresa.empresa.dim_employee_daily_empresa` d
        ON LOWER(e.p2o_username) = d.employee
        AND DATE(e.p2o_datetime_in) = d.p2o_date
      WHERE DATE(e.p2o_datetime_in) BETWEEN '2026-01-01' AND '2026-01-31'
      GROUP BY 1, 2, 3, 4, 5

Filtro de qualidade recomendado para events

Revisão 2026-08-04. A condição AND p2o_total_seconds > 0 foi acrescentada ao filtro. Ela é obrigatória: p2o_total_seconds >= p2o_total_idle é satisfeita por eventos de duração zero (0 >= 0), que são o sinal de estação bloqueada. Mantidos na base, eles distorcem qualquer cálculo que estenda a duração de um evento até o evento seguinte.
SQL
WHERE
        LOWER(p2o_username) != 'fhinck'
        AND p2o_total_seconds >= p2o_total_idle
        AND p2o_total_seconds > 0
        AND (p2o_source IS NULL OR UPPER(p2o_source) != 'CORRUPTED')
        AND (odd_behavior IS NULL
          OR (odd_behavior NOT LIKE '%Invalid total_seconds%'
              AND odd_behavior NOT LIKE '%Unexpected Time Change%'
              AND odd_behavior NOT LIKE '%Corrupted File%'))
Última atualização: 2026-04-07 · Gerado a partir da documentação oficial do Data Lake Fhinck

15. Detalhes Técnicos do Pipeline

Informações extraídas do pipeline de atualizacao diaria da Fhinck que popula as tabelas diariamente às 3h. Clustering verificado em produção (fnk-bi-{cliente}).

15.1 Particionamento e Clustering

TabelaPartiçãoClustering
events_{company}DAY (p2o_datetime_in)p2o_username
time_extension_request_{company}DAY (request_date)request_timestamp, username, accepted_timestamp
time_tracking_{company}DAY (action_date)username, action_date
rel_department_hierarchy_{company}department_name, department_code
rel_role_attribute_{company}role_name, role_code
rel_region_attribute_{company}region_name, region_code
rel_hierarchy_employee_associative_{company}employee, department_path, fk_role_code, fk_region_code
rel_hierarchy_domain_associative_{company}domain, department_path, fk_role_code, fk_region_code
dim_employee_daily_{company}employee, p2o_date

15.2 Estratégia de Deduplicação

Todas as tabelas dimensionais (rel_*, dim_*) usam ROW_NUMBER() para manter apenas o registro mais recente por chave primária:

SQL
-- Padrão aplicado em TODAS as tabelas rel_*
      SELECT *
      FROM (
        SELECT *,
          ROW_NUMBER() OVER (
            PARTITION BY {primary_key}
            ORDER BY creation_date DESC
          ) AS rn
        FROM source_table
      )
      WHERE rn = 1

15.4 Frequência e Lógica de Atualização