📋 Como tem sido a sua experiência com o Help Center? Partilhe rapidamente connosco a sua opinião.

Cálculo de Valores por Funções Personalizadas

Prev Next
  • PT

  • ES

  • AO

  • CV

  • MZ

  • Professional

  • Executive

  • Public Sector

  • Omnia

  • Evolution


Disponível com a Service Release 6 da versão 10.20

As funções personalizadas permitem efetuar cálculos de valores através de scripts (escritas em Javascript), sem recurso a extensibilidade. Estas funções podem ser utilizadas no cálculo de valores de remunerações, descontos e horas extra.

A implementação e validação destas funções exigem conhecimentos de programação em JavaScript, bem como da API do ERP Primavera, em particular das entidades envolvidas no processamento salarial.


Cálculo

Esta funcionalidade permite calcular remunerações, descontos e horas extra através da definição de regras de cálculo específicas. Destina-se, sobretudo, a cenários em que os valores a calcular não podem ser obtidos através das fórmulas standard da aplicação, permitindo implementar lógica de cálculo personalizada.

As funções personalizadas são uma versão simplificada da extensibilidade, ou seja, permitem definir uma fórmula em JavaScript que calcula o valor, sem necessidade de recorrer à extensibilidade clássica.

Assistência do Cegid Pulse (Apenas Evolution)

O Cegid Pulse pode auxiliar na criação de funções personalizadas, convertendo um pedido escrito em linguagem natural num script JavaScript. Apesar desta assistência, deverá sempre rever, validar e testar o código gerado antes da sua utilização em ambiente produtivo.

A função personalizada deve devolver exclusivamente o valor da rúbrica (remuneração, desconto ou hora extra). Sempre que aplicável, a quantidade continua a ser calculada segundo as regras normais da respetiva rúbrica.

Particularidades dos descontos

Nos descontos, a função personalizada não é aplicada aos descontos de sistema:

  • IRS;

  • Segurança Social;

  • CGA;

  • Fundos;

  • ADSE;

  • Seguros

Como exceção, a funcionalidade pode ser utilizada nos seguintes tipos de desconto:

  • Outros descontos de IRS;

  • Descontos de sindicato;

  • Qualquer outro desconto que não se enquadre nos descontos de sistema.

Quando um desconto é calculado através de uma função personalizada, o valor devolvido é tratado como a base de incidência do desconto, sendo posteriormente aplicada a percentagem configurada na rúbrica. Tal significa que, quando o valor devolvido pela função corresponde ao valor final pretendido, a percentagem do desconto deverá ser configurada com o valor 100%.


Criação

Para adicionar uma função personalizada, siga os seguintes passos:

  1. Aceder à respetiva entidade (tabelas de Remunerações, Descontos ou Horas Extra), onde pretende calcular o valor;

  2. Criar a rúbrica e preencher os campos habituais;

  3. Configurar o cálculo da seguinte forma:

    • Remunerações: selecionar a fórmula Função Personalizada;

    • Horas Extra e Descontos: selecionar a opção Função Personalizada;

  4. Clicar no botão Fx para abrir o editor de fórmulas;

  5. Introduzir ou utilizar o Pulse para gerar o código da função;

  6. Validar o comportamento da função através de um processamento manual;

  7. Utilizar a função em ambiente produtivo.

A expressão da função personalizada deverá devolver o valor da remuneração, desconto ou hora extra que será considerado para o valor final, sendo que o valor devolvido deverá ser um número (Number).

Deverá escrever funções que sejam simples e eficientes, dado que a função será avaliada para cada caso onde está referenciada. Funções com complexidade elevada podem impactar o desempenho do processamento.

Saiba mais sobre o editor de fórmulas no artigo de apoio.


Objetos de contexto

Quando a função personalizada é avaliada, o sistema irá disponibilizar como variáveis de contexto os seguintes parâmetros:

Remunerações

Varíavel

Descrição

Processamento

Entidade processamento que está a ser processado (RhpBEProcessamento);

Funcionario

Entidade funcionário que está a ser processado (RhpBEFuncionario);

Remuneracao

Entidade remuneração que está a ser calculada (RhpBERemuneracao);

ProcRemuneracao

Entidade remuneração de processamento que está a ser processada (RhpBEProcRemuneracao);

Parametros

Parâmetros do módulo de RH (RhpBEParametros).

Horas Extra

Variável

Descrição

Processamento

Entidade processamento que está a ser processado (RhpBEProcessamento);

Funcionario

Entidade funcionário que está a ser processado (RhpBEFuncionario);

HoraExtra

Entidade hora extra que está a ser calculada (RhpBEHoraExtra);

ProcHoraExtra

Entidade hora extra de processamento que está a ser processada (RhpBEProcHoraExtra);

Parametros

Parâmetros do módulo de RH (RhpBEParametros).

Descontos

Variável

Descrição

Processamento

Entidade processamento que está a ser processado (RhpBEProcessamento);

Funcionario

Entidade funcionário que está a ser processado (RhpBEFuncionario);

Desconto

Entidade desconto que está a ser calculada (RhpBEDesconto);

ProcDesconto

Entidade desconto de processamento que está a ser processada (RhpBEProcDesconto);

Parametros

Parâmetros do módulo de RH (RhpBEParametros).

Exemplos

Os parâmetros indicados anteriormente fornecem informações que podem ser necessárias para que a função personalizada possa calcular corretamente o valor, considerando-os na sua lógica de cálculo. De seguida, apresentamos algumas exemplos de utilização destas variáveis:

let dataAdmissao = Funcionario.DataAdmissao; // Data de admissão do funcionário
let dataProcessamento = Processamento.DataProcessamento; // Data do processamento
let codigoRemuneracaoVenc = Params.CodVencimento; // Código da remuneração de vencimento

Na estrutura das entidades está disponível no formulário de edição da função personalizada (janela de contexto), onde é possível navegar pelas propriedades das entidades e consultar os tipos de dados de cada propriedade.

Poderão existir propriedades que não estão preenchidas no processamento atual ou no momento da avaliação da função personalizada. Por exemplo:

  • a propriedade Processamento.DataSaida só estará preenchida se o processamento for fim de contrato;

  • a propriedade Processamento.SalarioHoraHExtra não tem valor porque este só é obtido após o cálculo de todas as remunerações do processamento, incluindo a remuneração que está a ser calculada.

Saiba mais informações no artigo de apoio.


Cegid Pulse

Para simplificar o processo de criação de funções, poderá escrever o cálculo que pretende em linguagem natural e solicitar ao Cegid Pulse para que converta numa função em javascript. Para obter melhores resultados, deverá

  • utilizar descrições objetivas e detalhadas;

  • indicar claramente as regras de cálculo pretendidas;

  • identificar as entidades e propriedades relevantes.

Uma vez que o resultado é gerado por Inteligência Artificial, deverá sempre validar e testar o código antes da sua utilização.

Exemplos de funções personalizadas

Remunerações

Devolve 10% do valor total das remunerações do processamento. Note-se que exclui a remuneração que está a ser processada para evitar que o valor da remuneração seja incluído no cálculo.

Neste exemplo também está demonstrado o uso da função dependencia para indicar à aplicação que esta remuneração depende das referenciadas.

Resultado:

 var valor = 0;
    for (const remuneracao of Processamento.Remuneracoes) {
        if (!Object.is(remuneracao, Remuneracao)) {
            valor += remuneracao.Valor;
            dependencia(remuneracao);
        }
    }
    return valor * 0.1;

Horas Extra

Calcula o valor da seguinte forma:

  • Se dia da hora extra for ao sábado ou domingo aplica 200% por cada hora;

  • Nos restantes dias, considera:

    1. 150% pela primeira hora em dia útil;

    2. 175% por hora ou fração das horas seguintes em dia útil;

Resultado:

const diaSemana = ProcHoraExtra.Data.getDay(); // 0 = domingo, 6 = sábado
const tempoHoras = ProcHoraExtra.Tempo;
if (tempoHoras <= 0) {
    throw new Error("Tempo de horas extra inválido (deve ser superior a 0).");
}
const valorBaseHora = ProcHoraExtra.ValorUnitario;
if (valorBaseHora <= 0) {
    throw new Error("Valor base da hora extra inválido (deve ser superior a 0).");
}
let valorCalculado;
if (diaSemana === 0 || diaSemana === 6) {
    // Fim de semana: 200% por cada hora
    valorCalculado = tempoHoras * valorBaseHora * 2;
} else {
    // Dia útil: 150% pela primeira hora, 175% pelas restantes horas ou frações
    const primeiraHora = Math.min(tempoHoras, 1); // máximo 1 hora para a primeira hora
    const horasRestantes = Math.max(tempoHoras - primeiraHora, 0);
    const valorPrimeiraHora = primeiraHora * valorBaseHora * 1.5; // 150% = 1.5 * base
    const valorHorasSeguintes = horasRestantes * valorBaseHora * 1.75; // 175% = 1.75 * base
    valorCalculado = valorPrimeiraHora + valorHorasSeguintes;
}
// Arredonda o resultado final a 2 casas decimais
const valorFinal = Number(valorCalculado.toFixed(2));
return valorFinal;

Descontos

Calcula desconto em valor que seja:

  • 480,92 € por cônjuge ativo

  • 250 € por cada filho (descendente) ativo

Resultado:

const valorPorConjugeAtivo = 480.92;
const valorPorFilhoAtivo = 250;
let numConjugesAtivos;
if (Funcionario.EstadoCivil === "001") {
    numConjugesAtivos = 1;
} else {
    numConjugesAtivos = 0;
}
const numFilhosAtivos = Funcionario.Dependentes;
let valorDesconto = (numConjugesAtivos * valorPorConjugeAtivo) + (numFilhosAtivos * valorPorFilhoAtivo);
valorDesconto = Number(valorDesconto.toFixed(2));
return valorDesconto;

Estes exemplos foram gerados com recurso a Inteligência Artificial. Se tentar replicar o exemplo ,poderá obter scripts diferentes.


Métodos especiais

Além das variáveis de contexto, existem alguns métodos especiais que podem ser utilizados na função personalizada:

dependencia()

dependencia(RhpBEProcRemuneracao procRemuneracao)

Permite declarar dependências de outras remunerações para que o sistema saiba que a remuneração para o qual está a ser calculada a função personalizada depende do valor de outras remunerações.

    dependencia(remuneracao);

log()

log(mensagem: string): void

Permite adicionar uma mensagem de log no Log do ERP. Esta opção poderá ser útil para diagnosticar valor de variáveis que estão a ser utilizadas na função.

    log('Valor = ' + valor.toString());

DaValorAtributos()

DaValorAtributos(tabela: string, atributos: string, campoChave: string, valorChave: any): StdBECampos

Devolve o valor dos atributos da tabela especificada. Indicar no parâmetro atributos os nomes dos atributos separados por vírgula.

// Obter os campos da tabela Instrumentos, pedindo apenas o atributo 'NumHoras'
 const camposInstrumento = DaValorAtributos(
    'Instrumentos',   // nome da tabela
    'NumHoras',       // lista de atributos a devolver (apenas NumHoras)
    'Instrumento',    // campo chave na tabela Instrumentos
    Funcionario.Instrumento // valor da chave: instrumento do funcionário
);
const campoNumHoras = camposInstrumento[0];
log("numHoras" + campoNumHoras.valor.toString());
return campoNumHoras.Valor;

DaValorAtributosCondicao()

DaValorAtributosCondicao(tabela: string, atributos: string, expressaoCondicao: string): StdBECampos

Devolve o valor dos atributos da tabela especificada. Indicar no parâmetro atributos os nomes dos atributos separados por vírgula e uma condição sql no parâmetro expressaoCondicao.

const camposInstrumento = DaValorAtributosCondicao(
    "RHP_ParametrosIAS", //nome da tabela
    "ValorIAS,Tipo",     //lista de atributos a devolver( valorIAS e o tipo)
    "DataInicio = '2026-01-01' and tipo = 1" //expressão da condição
);
if (camposInstrumento)
{
    return camposInstrumento["ValorIAS"].Valor;
}
return 0;