Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

📊 Painel de Checkout - Documentação Completa

1. Visão Geral

Módulo para monitoramento integrado de produção com:

  • Comparativo entre previsto × realizado
  • Cálculo automático de PPC (Planejamento e Programação de Controle)
  • Visualização de ocorrências e métricas operacionais
  • Filtros avançados por período, equipe e hierarquia

O painel é disponibilizado através de um registro na tabela nfs_core_menu. Para ativá-lo, utilize o seguinte INSERT como base:

INSERT INTO nfs_core_menu (
    SEQ_DB, EMPRESA, FILIAL, LOCAL, DESCRICAO, TYPE, 
    ATIVO, FATHER, MENUORDER, URL, FILTER, ICON
) VALUES (
    10070,                          -- SEQ_DB fixo do Painel de Checkout
    9999,                           
    9999,                            
    9999,                           
    'Painel de Checkout',           
    'LINK',                         
    1,                             
    1,                              
    9,                              
    'checkoutPanel',                
    NULL,                           
    'fa fa-tachometer'              
);

1.1 Visão Geral - Explicação Visual do Painel pelo figma:

🔗 Clique para visualizar o painel interativo no Figma

1.2 Calculos - Com Exemplos Práticos

1. PPC Semanal

Como funciona:
Conta todas as tarefas válidas de todas EQUIPES (por encarregados) durante o período de dias definido no filtro.
Verifica quantas dessas tarefas estão 100% concluídas (PPC_TAREFA == 100).

Fórmula:

  • PPC Geral Semana = (Nº de tarefas 100% concluídas / Total de tarefas válidas) × 100 Exemplo:
  • Período do filtro: 01/01/2025 até 07/01/2025
  • Total de tarefas válidas: 200
  • Tarefas 100% concluídas: 150
  • Cálculo: (150/200) × 100 = 75%

2. PPC por Encarregado

Como funciona:
Conta todas as tarefas válidas de uma EQUIPE baseada no ENCARREGADO durante o período do filtro.

Fórmula:

  • PPC Encarregado = (Nº de tarefas 100% concluídas pela equipe / Total de tarefas válidas da equipe) × 100

Exemplo:

  • Período do filtro: 01/01/2025 até 07/01/2025
  • Encarregado: João Silva
  • Total de tarefas válidas: 20
  • Tarefas 100% concluídas: 10
  • Cálculo: (10/20) × 100 = 50%

3. PPC por Tarefa Individual

Como funciona:
Avaliação binária (100% ou 0%) de cada tarefa durante o período do filtro.

Critério:

  • Se produção_atingida ≥ meta_prevista → 100% Senão → 0%

Exemplo:

  • Tarefa: Instalação elétrica
  • Meta prevista: 100 unidades
  • Produção atingida: 98 unidades
  • Resultado: 0% (não atingiu 100%)

4. % Produção do Dia

Como funciona:
Cálculo diário para um encarregado específico.

Fórmula:

  • % Produção Dia = (Nº tarefas 100% concluídas no dia / Total tarefas válidas no dia) × 100

Exemplo:

  • Data: 03/01/2025
  • Encarregado: Maria Souza
  • Total tarefas válidas: 8
  • Tarefas concluídas: 6
  • Cálculo: (6/8) × 100 = 75%

2. Configuração Inicial

2.1 Registro para ativação do painel no Menu

INSERT INTO nfs_core_menu 
(SEQ_DB, EMPRESA, FILIAL, LOCAL, DESCRICAO, TYPE, ATIVO, FATHER, MENUORDER, URL, FILTER, ICON) 
VALUES 
(
    10070, 
    9999, 
    9999, 
    9999, 
    'Painel de Checkout', 
    'LINK', 
    1, 
    9999, 
    1, 
    'checkoutPanel', 
    NULL, 
    'fa fa-tachometer'
);

3. Customização de Estrutura (Nos casos em que as tabelas app não existem no cliente que quer configurar o painel)

Contexto

O painel pressupõe o uso de tabelas padronizadas do sistema (
app_efetivo_funcionario app_mo_oper app_oper_grupo_metrica app_efetivo_engenheiro app_folha_tarefa app_unidade_medida app_mo_apt_motivo app_tarefa app_frente app_motivo app_folha_tarefa_n_frente app_mo_boletim ).

Entretanto, para clientes que utilizam estrutura diferente dessa, é possível adaptar o módulo por meio de um parâmetro JSON configurável via entry point.

Registro de Tabelas e Colunas Ausentes ⚠️

O painel de checkout inclui um mecanismo automático de log que registra nos logs quais tabelas ou colunas necessárias não existem na estrutura do cliente.

3.1 SQL para ativação das customizações por parâmetros se necessário'

INSERT INTO nfs_entry_point (
    SEQ_DB,
    FILE_OR_DOMAIN,
    `ACTION`,
    XMOVA_INSTALLCODE,
    XMOVA_INSTALLCODE_VERSION,
    EMPRESA,
    FILIAL,
    `LOCAL`,
    TABELA,
    ENTRY_NUM,
    CODE,
    VERSION,
    BUILD,
    ATIVO,
    CODETYPE,
    FIELD,
    DESCRIPTION,
    INS_DH,
    UPD_DH,
    NFS_USER,
    DB_USER
) VALUES (
    765, -- [EXEMPLO] próximo SEQ_DB disponível na tabela
    'PANEL',
    'CHECKOUT_PANEL_CUSTOM',
    NULL,
    NULL,
    9999,
    9999,
    9999,
    '',
    NULL,
    '{
      "panel_remap": {
      },
      "customize": {
      }
    }'-- [EXEMPLO] Configuração do JSON de customizações e remap
    ,
    1,
    NULL,
    1,
    'JSON',
    NULL,
    NULL,
    '2022-09-23 22:46:08',
    '2025-07-08 01:49:52',
    'simova.admin@simova.com.br',
    'exemplo@000.00.000.000'-- [EXEMPLO] vai salvar o usuário da alteração
);

3.2 Exemplos de configurações de JSON da coluna 'CODE' da tabela 'nfs_entry_point'

Configuração para substituir tabelas dentro da chave 'panel_remap':

{
  "panel_remap": {
    "tabela_original": "tabela_customizada",
    "tabela.original_2": "tabela_customizada_2"
  }
}

Configuração para substituição de Colunas:

{
  "panel_remap": {
    "tabela_original.coluna_original": "coluna_customizada",
    "tabela_original.coluna_original_2": "coluna_customizada_2"
  }
}

Traduzindo o valor padrão de cada título usado no customize para utilizar na configuração JSON:

Tabela Principal (ordem da esquerda para direita sem estar com as tarefas expandidas)

Chave JSONPosiçãoExemplo de Valor Padrão
table_column_title_1"Gestor"
table_column_title_2"Supervisor"
table_column_title_3"Encarregado/Líder"
table_column_ppc_week"PPC Semana"
table_column_ppc_in_charge"PPC Encarregado"
table_column_ppc_task"PPC Acumulado Tarefa"

Subtabela (Detalhamento por Equipe)

Chave JSONPosiçãoExemplo de Valor Padrão
subtable_title_1"Tarefa (CPO/FECHA)"
subtable_title_2"OBSERVAÇÃO (PLANEJAMENTO)"
subtable_title_3"UNIDADE MEDIDA"
subtable_title_4"SEMANA"
subtable_title_5"AVANÇO DE PRODUÇÃO"

Seção de Ocorrências

Chave JSONPosiçãoExemplo de Valor Padrão
occurrence_title_1"DATA OCORRENCIA"
occurrence_title_2"TAREFA (CPO / FECHA)"
occurrence_title_3"TIPO DE OCORRÊNCIA"
occurrence_title_4"DETALHE DA OCORRÊNCIA"
occurrence_title_5"CAUSA"
occurrence_title_6"SOLUCIONADO"

Ex Customização de títulos de Colunas passando dentro da chave 'customize' se baseando nos valores acima

{
  "customize": {
    "table_column_title_1": "titulo_customizado",
    "table_column_title_2": "titulo_customizado2",
    "table_column_title_2": "titulo_customizado3",
    "table_column_ppc_week": "titulo_customizado_ppc_week",
    "table_column_ppc_in_charge": "titulo_customizado_ppc_in_charge",
    "table_column_ppc_task": "titulo_customizado_ppc_task",
    "subtable_title_1": "titulo_customizado_subtable",
    "subtable_title_2": "titulo_customizado_subtable2",
    "subtable_title_3": "titulo_customizado_subtable3",
    "subtable_title_4": "titulo_customizado_subtable4",
    "subtable_title_5": "titulo_customizado_subtable5",
    "occurrence_title_1": "titulo_customizado_ocurrence1",
    "occurrence_title_2": "titulo_customizado_ocurrence2",
    "occurrence_title_3": "titulo_customizado_ocurrence3",
    "occurrence_title_4": "titulo_customizado_ocurrence4",
    "occurrence_title_5": "titulo_customizado_ocurrence5",
    "occurrence_title_6": "titulo_customizado_ocurrence6"
  }
}

Customização para ocultar colunas específicas seguindo a mesma lógica da customização de títulos porémm sem a possibilidade de ocultar as principais colunas subtabela, apenas da tabela principal, PPC e das ocorrencias, qualquer um desses, se estiver presente no JSON de configuração com o valor 1, ocultará a coluna referenciada

{
  "customize": {
    "table_column_hide_1": 1,
    "table_column_hide_2": 1,
    "table_column_hide_3": 1,
    "table_column_ppc_hide": 1,
    "occurrence_hide_1": 1,
    "occurrence_hide_2": 1,
    "occurrence_hide_3": 1,
    "occurrence_hide_4": 1,
    "occurrence_hide_5": 1,
    "occurrence_hide_6": 1
  }
}

Customização de cores à principio apenas da tabela e subtabela passando código hexadecimal da COR dentro do próprio 'customize'

{
  "customize": {
    "table_color": "#ffaa00",
    "subtable_color": "#D35400"
  }
}

Customização para permitir que o cálculo das porcentagens diárias da equipe ou do total de equipes (diário também) exceda 100% (por padrão é sempre 100).'

Importante: Esta configuração não afeta apenas a visualização, mas altera diretamente os cálculos matemáticos das porcentagens. Quando ativada (valor 1), os cálculos consideram valores reais acima de 100%, afetando médias, totais e qualquer operação matemática subsequente que dependa desses valores. Quando desativada (valor 0), qualquer valor calculado acima de 100% é truncado para 100% antes de qualquer operação adicional.

Como funciona:

exceed_100_mask_for_team_percentage: Controla porcentagens individuais das equipes

0 (padrão): Valores acima de 100% são limitados a 100%

1: Mostra o valor real calculado (pode ser 120%, 150%, etc.)

exceed_100_mask_for_daily_percentage: Controla a porcentagem média diária (todas equipes)

0 (padrão): Médias acima de 100% são limitadas a 100%

1: Mostra a média real calculada

{
  "customize": {
    "exceed_100_mask_for_team_percentage": 1,
    "exceed_100_mask_for_daily_percentage": 1
  }
}

Configuração de Sub-Tarefas (NFSCORE-1406)

O que são Sub-Tarefas?

As sub-tarefas permitem um detalhamento maior das atividades, onde tarefas principais podem ser divididas em componentes menores ao clicar na tarefa.

Como ativar/desativar:

A funcionalidade é controlada pelo parâmetro sub_task_setting no JSON de configuração dentro de 'customize':

{
  "customize": {
    "sub_task_setting": 1
  }
}

3.3 Configuração de Larguras e Ordenação de Colunas (NFSCORE-1456)

Contexto

Foi implementado suporte para definição dinâmica de larguras de colunas e ordenamento configurável tanto na tabela principal, quanto nas subtabelas e subtarefas. Essa configuração é feita via parâmetros no JSON do entry point.

Parâmetros Disponíveis

Larguras (valores aceitam px, %, ou qualquer unidade CSS):

Tabela Principal

  • table_column_width_1
  • table_column_width_2
  • table_column_width_3

Subtabela (Equipe)

  • subtable_column_width_1
  • subtable_column_width_2
  • subtable_column_width_3
  • subtable_column_width_4
  • subtable_column_width_5

Subtarefas

  • subtabletask_column_width_1
  • subtabletask_column_width_2
  • subtabletask_column_width_3
  • subtabletask_column_width_4
  • subtabletask_column_width_5
Ordenação (string com índices separados por vírgula):
  • table_order → define a ordem de exibição da tabela principal
  • subtable_order → define a ordem de exibição das subtabelas e subtarefas

Exemplos de uso:

{
  "customize": {
    "table_column_width_1": "150px",
    "table_column_width_2": "200px",
    "table_column_width_3": "100px",
    "table_order": "3,2,1",
    "subtable_order": "3,5,1,2,4"
  }
}

{
  "customize": {
    "table_column_width_1": "200px",
    "table_column_width_2": "150px",
    "table_column_width_3": "180px",
    "table_order": "3,1,2",
    "subtable_column_width_1": "250px",
    "subtable_column_width_2": "200px",
    "subtable_column_width_3": "150px",
    "subtable_column_width_4": "180px",
    "subtable_column_width_5": "220px",
    "subtable_order": "5,1,2,3,4"
  }
}

📐 Importância da Soma Total das Larguras

A soma das larguras precisa ser consistente com o layout esperado:

  • Se a soma for menor, podem aparecer espaços em branco ou desalinhamentos.
  • Se a soma for maior, pode ocorrer sobreposição de colunas ou problemas no scroll horizontal.

➡️ Esse controle garante que as colunas fixas permaneçam estáveis e alinhadas mesmo ao rolar o painel.


✅ Correções Incluídas

  • Resolvido o problema ao abrir múltiplas subtarefas simultaneamente, onde antes as configurações de largura/ordem eram sobrescritas.
  • Agora cada subtabela/subtarefa mantém sua configuração independente, garantindo previsibilidade e consistência.

4 🔧 EntryPoints para Customização de Cálculos PPC

📋 EntryPoints Disponíveis

EntryPointDescriçãoFallback
CHECKOUT_PPCCalcula PPC TAREFA, PPC ENCARREGADO e PPC GERAL

📋 Visão Geral

O sistema possui um EntryPoint chamado CHECKOUT_PPC que permite customizar completamente a lógica de cálculo dos três níveis de PPC:

PPC TAREFA: Percentual de conclusão de uma tarefa específica

PPC ENCARREGADO: Média do PPC de todas as tarefas de um encarregado

PPC GERAL: Média do PPC de todos os encarregados

🎯 Estrutura dos Dados Disponíveis

O EntryPoint recebe diferentes estruturas de dados dependendo do nível do cálculo:

4.0.1 Cálculo de PPC TAREFA

// $this->param['tarefa'] contém:
[
    '2024-01-01' => [
        'TOTAL_METRICA_PREVISTA' => 100,    // Planejado do dia
        'TOTAL_METRICA_PRODUZIDA' => 80      // Realizado do dia
    ],
    '2024-01-02' => [
        'TOTAL_METRICA_PREVISTA' => 100,
        'TOTAL_METRICA_PRODUZIDA' => 100
    ]
    // ... mais dias
]

4.0.2 Cálculo de PPC ENCARREGADO

// $this->param['tarefas'] contém array de tarefas do encarregado
[
    [ // Tarefa 1 (mesma estrutura do PPC TAREFA)
        '2024-01-01' => ['TOTAL_METRICA_PREVISTA' => 100, 'TOTAL_METRICA_PRODUZIDA' => 80],
        '2024-01-02' => ['TOTAL_METRICA_PREVISTA' => 100, 'TOTAL_METRICA_PRODUZIDA' => 100]
    ],
    [ // Tarefa 2
        '2024-01-01' => ['TOTAL_METRICA_PREVISTA' => 50, 'TOTAL_METRICA_PRODUZIDA' => 50],
        '2024-01-02' => ['TOTAL_METRICA_PREVISTA' => 50, 'TOTAL_METRICA_PRODUZIDA' => 25]
    ]
]

4.0.3 Cálculo de PPC GERAL

// $this->param['data'] contém dados agregados por encarregado
[
    'encarregado1' => [
        'TAREFAS_AGREGADAS' => [ // Array de tarefas do encarregado
            [ /* tarefa 1 */ ],
            [ /* tarefa 2 */ ]
        ]
    ],
    'encarregado2' => [
        'TAREFAS_AGREGADAS' => [ /* tarefas */ ]
    ]
]

💻 4.1 Implementando sua Própria Lógica

Passo 1: Identificar o Nível de Cálculo

  • O primeiro passo é sempre identificar qual nível está sendo calculado:
if (isset($this->param['tarefa'])) {
    // É PPC de uma tarefa específica
} elseif (isset($this->param['tarefas'])) {
    // É PPC de um encarregado (múltiplas tarefas)
} elseif (isset($this->param['data'])) {
    // É PPC geral (múltiplos encarregados)
}

4.1.1 Implementar a Lógica Desejada

📌 Exemplo 1: Regra Binária (100% ou 0%)

if (isset($this->param['tarefa'])) {
    // PPC TAREFA: 100% se realizou TODO o planejado
    $totalPlanejado = 0;
    $totalReal = 0;
    
    foreach ($this->param['tarefa'] as $dia => $dados) {
        if (is_array($dados)) {
            $totalPlanejado += $dados['TOTAL_METRICA_PREVISTA'] ?? 0;
            $totalReal += $dados['TOTAL_METRICA_PRODUZIDA'] ?? 0;
        }
    }
    
    // Regra: 100% se REAL >= PLANEJADO, senão 0%
    $this->outputValues = ($totalPlanejado > 0 && $totalReal >= $totalPlanejado) ? 100 : 0;
}

📌 Exemplo 2: Regra Proporcional

if (isset($this->param['tarefa'])) {
    // PPC TAREFA: Percentual baseado na média diária
    $somaPercentuais = 0;
    $diasComDados = 0;
    
    foreach ($this->param['tarefa'] as $dia => $dados) {
        if (is_array($dados)) {
            $planejado = $dados['TOTAL_METRICA_PREVISTA'] ?? 0;
            $real = $dados['TOTAL_METRICA_PRODUZIDA'] ?? 0;
            
            if ($planejado > 0) {
                $percentualDia = min(($real / $planejado) * 100, 100);
                $somaPercentuais += $percentualDia;
                $diasComDados++;
            }
        }
    }
    
    // Média dos percentuais diários
    $this->outputValues = $diasComDados > 0 ? round($somaPercentuais / $diasComDados, 2) : 0;
}

Passo 3: Considerações Importantes

Sempre valide se os índices existem antes de usá-los (?? 0 ou isset())

Output deve ser numérico (0-100) - use round() para decimais

Proteja contra divisão por zero verificando se o divisor é maior que zero

Use min($valor, 100) para garantir que nunca ultrapasse 100%

🔧 Inserindo no Banco de Dados

INSERT INTO nfs_entry_point (
    SEQ_DB, FILE_OR_DOMAIN, ACTION, EMPRESA, FILIAL, LOCAL, 
    TABELA, ENTRY_NUM, CODE, ATIVO, CODETYPE, DESCRIPTION
) VALUES (
    NEXTVAL('seq_nfs_entry_point'),
    'SYSTEM',
    'CHECKOUT_PPC',
    9999,  -- Sua empresa
    9999,  -- Sua filial
    9999,  -- Seu local
    'CHECKOUT_PANEL',
    1,     -- Número do entry point
    'SEU CÓDIGO PHP AQUI',
    1,     -- 1 = Ativo
    'PHP',
    'Descrição do seu cálculo'
);

🔧 Configuração de exemplo no Banco (alguns VALUES são exemplos, não considerar ao fazer o INSERT)

Este exemplo implementa uma lógica radical de avaliação de desempenho onde as tarefas só são consideradas 100% concluídas se atingirem ou superarem TODO o planejado. Caso contrário, a nota é ZERO.

INSERT INTO nfs_entry_point 
(SEQ_DB, FILE_OR_DOMAIN, ACTION, XMOVA_INSTALLCODE, XMOVA_INSTALLCODE_VERSION,
 EMPRESA, FILIAL, LOCAL, TABELA, ENTRY_NUM, CODE, VERSION, BUILD, 
 ATIVO, CODETYPE, FIELD, DESCRIPTION, INS_DH, UPD_DH, NFS_USER, DB_USER)
VALUES 
(NEXTVAL('seq_nfs_entry_point'), 'SYSTEM', 'CHECKOUT_PPC', NULL, NULL,
 9999, 9999, 9999, 'CHECKOUT_PANEL', 1, 
"
if (isset($this->param['tarefa'])) {
    // PPC_TAREFA
    // NOVA REGRA: Quando Real TOTAL >= Planejado TOTAL → 100%, senão → 0%
    $tarefa = $this->param['tarefa'];
    $totalReal = 0;
    $totalPlanejado = 0;

    foreach ($tarefa as $day => $data) {
        if (!is_array($data)) continue;
        
        $planejado = $data['TOTAL_METRICA_PREVISTA'] ?? 0;
        $real = $data['TOTAL_METRICA_PRODUZIDA'] ?? 0;

        $totalPlanejado += $planejado;
        $totalReal += $real;
    }

    // NOVA REGRA: Se Real TOTAL >= Planejado TOTAL → 100%, senão → 0%
    $ppc = ($totalPlanejado > 0 && $totalReal >= $totalPlanejado) ? 100 : 0;
    $this->outputValues = $ppc;
    
} elseif (isset($this->param['tarefas'])) {
    // PPC_ENCARREGADO
    // NOVA REGRA: Soma o percentual de cada linha de tarefa e divide pela quantidade de tarefas
    $tarefas = $this->param['tarefas'];
    $somaPpcTarefas = 0;
    $quantidadeTarefas = 0;

    foreach ($tarefas as $tarefa) {
        $totalReal = 0;
        $totalPlanejado = 0;
        
        foreach ($tarefa as $day => $data) {
            if (!is_array($data)) continue;
            
            $planejado = $data['TOTAL_METRICA_PREVISTA'] ?? 0;
            $real = $data['TOTAL_METRICA_PRODUZIDA'] ?? 0;

            $totalPlanejado += $planejado;
            $totalReal += $real;
        }
        
        // NOVA REGRA: Tarefa binária - 100% ou 0% (não mais por dias)
        if ($totalPlanejado > 0) {
            $ppcTarefa = ($totalReal >= $totalPlanejado) ? 100 : 0;
            $somaPpcTarefas += $ppcTarefa;
            $quantidadeTarefas++;
        }
    }

    // Média dos PPCs das tarefas
    $ppc = ($quantidadeTarefas > 0) ? ($somaPpcTarefas / $quantidadeTarefas) : 0;
    $this->outputValues = min(round($ppc, 2), 100);
    
} elseif (isset($this->param['data'])) {
    // PPC_GERAL/SEMANA
    // NOVA REGRA: Soma o percentual de cada PPC Encarregado e divide pela quantidade de encarregados
    $data = $this->param['data'];
    $somaPpcEncarregados = 0;
    $quantidadeEncarregados = 0;

    foreach ($data as $encarregadoData) {
        if (!isset($encarregadoData['TAREFAS_AGREGADAS'])) continue;
        
        $somaPpcTarefasEncarregado = 0;
        $quantidadeTarefasEncarregado = 0;
        
        foreach ($encarregadoData['TAREFAS_AGREGADAS'] as $task) {
            if (!is_array($task)) continue;
            
            $totalReal = 0;
            $totalPlanejado = 0;
            
            foreach ($task as $day => $t) {
                if (is_array($t)) {
                    $planejado = $t['TOTAL_METRICA_PREVISTA'] ?? 0;
                    $real = $t['TOTAL_METRICA_PRODUZIDA'] ?? 0;

                    $totalPlanejado += $planejado;
                    $totalReal += $real;
                }
            }
            
            // NOVA REGRA: Tarefa binária - 100% ou 0%
            if ($totalPlanejado > 0) {
                $ppcTarefa = ($totalReal >= $totalPlanejado) ? 100 : 0;
                $somaPpcTarefasEncarregado += $ppcTarefa;
                $quantidadeTarefasEncarregado++;
            }
        }
        
        // Calcula PPC do encarregado (média das tarefas)
        if ($quantidadeTarefasEncarregado > 0) {
            $ppcEncarregado = $somaPpcTarefasEncarregado / $quantidadeTarefasEncarregado;
            $somaPpcEncarregados += $ppcEncarregado;
            $quantidadeEncarregados++;
        }
    }

    // Média dos PPCs dos encarregados
    $ppc = ($quantidadeEncarregados > 0) ? ($somaPpcEncarregados / $quantidadeEncarregados) : 0;
    $this->outputValues = min(round($ppc, 2), 100);
    
}
", 
1, 0, 'PHP', NULL, 'Cálculo de PPC unificado', 
CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, 'SISTEMA', CURRENT_USER);

5 Flexibilização do Cálculo de Porcentagens via EntryPoint

5.1 Visão Geral

O Checkout Panel possui um sistema de cálculo de porcentagens flexível, permitindo que clientes personalizem a lógica de cálculo por meio de um EntryPoint específico.

Quando configurado, o sistema delega o cálculo das porcentagens para esse EntryPoint, possibilitando regras de negócio customizadas sem a necessidade de alteração do código principal do painel.


5.2 Sistema de Cálculo Flexível

5.2.1 Objetivo

Permitir que o cálculo de porcentagens das equipes e das médias globais seja ajustado conforme a necessidade do cliente.

5.3 Configuração do EntryPoint

5.3.1 Identificação

CampoValor
TipoSYSTEM
AçãoCHECKOUT_PERCENTAGE

5.4 Funcionamento do EntryPoint

5.4.1 Cálculo de Porcentagem por Equipe (Dia Específico)

Quando o parâmetro type for igual a team_percentage_by_day, o sistema chama o EntryPoint enviando o seguinte contexto:

$context = [
    'type' => 'team_percentage_by_day',
    'encarregado' => $encarregado,
    'day' => $day,
    'total_tasks' => $totalTasks,
    'count_concluded' => $countConcluded,
    'total_sum_team_percentage' => $porcentagemTotalEquipe
];

5.4.2 Exemplo de Cálculo Customizado por Equipe

if ($type === 'team_percentage_by_day') {

    // média baseada na soma das porcentagens
    // dividida pelo total de tarefas
    $foreman_data = $context['total_sum_team_percentage']
                    / $context['total_tasks'];

    $this->outputValues = $foreman_data;
}

5.4.3 Cálculo de Média Global Diária

Quando o parâmetro type for igual a global_daily_average, o sistema chama o EntryPoint com dados consolidados de todos os encarregados:

$context = [
    'type' => 'global_daily_average',
    'day' => $day,
    'total_tasks' => $totalTasks,
    'count_concluded' => $countConcluded,
    'valid_encarregados' => count($validEncarregados),
    'encarregados_data' => $validEncarregados
];

5.4.4 Exemplo de Cálculo Customizado Global

if ($type === 'global_daily_average') {

    $encarregados_data = $context['encarregados_data'] ?? [];
    $soma_total = 0;
    $total_encarregados = 0;

    foreach ($encarregados_data as $enc) {
        $avg_percentage = $enc['average_percentage'] ?? 0;

        if (is_numeric($avg_percentage)) {
            $soma_total += $avg_percentage;
            $total_encarregados++;
        }
    }

    // Média global baseada na média das porcentagens individuais
    $media_global = ($total_encarregados > 0)
        ? $soma_total / $total_encarregados
        : 0;

    $this->outputValues = $media_global;
}

5.5 Exemplo Completo de EntryPoint CHECKOUT_PERCENTAGE

$tasksData = $this->param['data'] ?? [];
$context   = $this->param['context'] ?? [];
$type      = $context['type'] ?? '';

if ($type === 'team_percentage_by_day') {

    $this->outputValues = $context['total_sum_team_percentage']
                          / $context['total_tasks'];

} elseif ($type === 'global_daily_average') {

    $encarregados_data = $context['encarregados_data'] ?? [];
    $soma_total = 0;
    $total_encarregados = 0;

    foreach ($encarregados_data as $enc) {
        $avg_percentage = $enc['average_percentage'] ?? 0;

        if (is_numeric($avg_percentage)) {
            $soma_total += $avg_percentage;
            $total_encarregados++;
        }
    }

    $this->outputValues = ($total_encarregados > 0)
        ? $soma_total / $total_encarregados
        : 0;
}

5.6 Fallback Padrão do Sistema

5.6.1 Porcentagem por Equipe

(countConcluded / totalTasks) * 100

5.6.2 Média Global

(countConcludedTotal / totalTasksTotal) * 100

5.7 Integração com Outras Configurações

Esta configuração funciona em conjunto com:

  • exceed_100_mask_for_team_percentage

  • exceed_100_mask_for_daily_percentage

  • Outras customizações do Checkout Panel

  • Sistema de remapeamento de tabelas e colunas