Última alteração a 18/11/2025
A extensibilidade é uma vantagem importante para qualquer produto. No Valuekeep, é possível definir quais os campos que devem ser preenchidos obrigatoriamente e criar regras para garantir o correto preenchimento desses campos.
Configurador de Regras de Negócio
O configurador de regras de negócio está disponível como add-on (custo adicional) e apenas na linha Universe.
As entidades que permitem esta extensibilidade são:
- Equipamentos (inclui as ferramentas);
- Localizações;
- Ordens de trabalho;
- Pedidos;
- Rotas;
Após a aquisição do add-on, pode aceder à funcionalidade através do menu, acedendo a Definições | Sistema |Configurador de regras de negócio.
Campos apresentados
Os campos são apresentados por ordem alfabética, sendo que os campos personalizados aparecem no final.
A definição da obrigatoriedade de um campo personalizado continua a ser feita através da opção de menu de Criação de campos personalizados.
O campo Apenas na criação afeta o cálculo do campo Fórmula de Cálculo. Se este campo estiver ativo, a fórmula de cálculo será aplicada apenas no momento de criação do registo.
O campo Fórmula de Cálculo apenas será calculado no momento da gravação do registo, o que significa que, se existir uma fórmula de cálculo associada a um campo que já é obrigatório por definição, terá de o preencher manualmente e, no momento da gravação, o valor calculado pela fórmula irá substituir o valor introduzido.
Os campos que são obrigatórios por definição não permitem remover a obrigatoriedade
Os seguintes tipos de campos personalizados não podem ser configurados na configuração de regras de negócio:
- Email;
- Phone;
- EntityLookup, do tipo ValueList;
- Enumerable;
- Url;
- Percentagem;
Regras de Negócio
Algumas regras que podem ser aplicadas são as seguintes:
Equipamentos/Localizações
Algumas regras aplicáveis aos equipamentos e localizações são as seguintes:
| Regra |
Campo onde aplicar a fórmula |
Campo de validação |
Exemplo de fórmula |
| Se a marca estiver preenchida, o modelo também tem de estar. |
Modelo |
Fórmula requerida |
HasValue([BrandNaturalKey]) |
| A data de fim de garantia é 15 dias depois da data de entrada ao serviço. |
Data de fim |
Fórmula de cálculo |
DateAdd('d', 15, [OnServiceDate]) |
| A descrição do equipamento é a concatenação dos três primeiros campos da localização, seguida do texto 'MC CUSTOM'. |
Descrição |
Fórmula de cálculo |
'Concat'(Substring([LocationNaturalKey], 0, 3),'MC CUSTOM') |
| As observações contêm 10 caracteres da descrição. |
Observações |
Fórmula de cálculo |
Substring([Description], 0, 10) |
Pedidos e Ordens de trabalho
Os campos seguintes são os disponíveis para personalização:
Pedidos
- Descrição;
- Tipo de pedido
- Tipo de ativo;
- Nível de prioridade;
- Motivo do pedido;
- Estado de funcionamento;
- Observações.
Ordens de trabalho
- Custo real;
- Duração real;
- Tipo (tipo de ativo);
- Clientes;
- Descrição;
- Custo esperado;
- Duração esperada;
- Estado de funcionamento;
- Observações;
- Responsável;
- Tipo de ordem de trabalho;
- Oficina;
Algumas regras aplicáveis aos pedidos e ordens de trabalho são as seguintes:
| Regra |
Campo donde aplicar a fórmula |
Campo de validação |
Exemplo de fórmula |
Observações |
| Apenas deve ser possível criar ordens de trabalho para o tipo de ativo equipamento. |
Tipo de ativo |
Fórmula de validação |
[AssetTypeValue] == 2 |
|
| Se o tipo de ordem de trabalho for “CR”. o tipo de ativo tem de ser equipamento. |
Tipo de ordem de trabalho |
Fórmula de validação |
- Ifs([WorkOrderTypeNaturalKey] == 'JQ' && [AssetType] != [AssetTypeValue.Equipment], false, true)
- !([WorkOrderTypeNaturalKey] == 'JQ' && [AssetType] != [AssetTypeValue.Equipment])
|
|
| Quando a ordem de trabalho transita para o estado Aprovado, o campo de utilizador Orçamento tem de estar preenchido. |
User_Orcamento |
Fórmula requerida |
[SchemaEntityStateNaturalKey] == 'OT02' |
O campo de utilizador criado é do tipo short text e não está como obrigatório. |
| Quando a ordem de trabalho transita para o estado Executado, o campo Custo Esperado tem de ser diferente de zero. |
Custo Esperado |
Fórmula de validação |
Ifs([SchemaEntityStateNaturalKey] == 'OT03' && [ExpectedCost] == 0, false, true) |
|
| Quando uma ordem de trabalho transita para o estado Fechado, o campo Tipo de Reparação tem de estar preenchido. |
User_TipoReparacao |
Fórmula requerida |
[SchemaEntityStateNaturalKey] == 'OT04' |
|
| Quando uma ordem de trabalho alterar para o estado Em Curso, o campo Fornecedor não pode estar vazio. |
Fornecedor |
Fórmula requerida |
[SchemaEntityStateNaturalKey] == 'OT02' |
|
| Se a ordem de trabalho passa para o estado Fechado, o campo de utilizador Site tem de ser preenchido. |
User_Site |
Fórmula requerida |
[SchemaEntityStateNaturalKey] == 'OT04' |
O campo Site é uma entidade personalizada. Se o campo Data estiver preenchido, o campo Duração tem de ser maior do que zero. |
| Validar que se o campo Custo esperado estiver preenchido, a duração esperada não pode ser zero. |
Duração Esperada |
Fórmula de validação |
Ifs(HasValue(ExpectedCost) && [ExpectedDurationSeconds] == 0, false, true) |
O campo Custo esperado e o campo Duração esperada é, por defeito, sempre zero. A aplicação desta fórmula define que estes campos nunca podem ter o valor zero. |
| Validar que o campo Duração real é sempre maior do que zero. |
Duração Atual |
Fórmula de validação |
Ifs([ActualDurationSeconds] > 0, true, false) |
|
| Preenchimento das observações com base na informação de outros campos. |
Observações |
Fórmula de cálculo |
'Concat'([Date],'-',[Description],'-', [WorkOrderTypeDescription],'-', [CustomerDescription],'-',[SupplierNaturalKey]) |
|
Exemplos de fórmulas de cálculo
Algumas das fórmulas de cálculo que podem ser utilizadas são as seguintes:
| Exp(x) |
Acos(-0.1) |
| Floor([ActualCost]) |
Asin(0.1) |
| Ceiling([ActualCost]) |
Atan(0.1) |
| Cos([ActualCost]) |
Exp(x) x < 50 |
| Sin([ActualCost]) |
Floor([ActualCost]) |
| Sqrt([ActualCost]) |
Ceiling([ActualCost]) |
| Tan([ActualCost]) |
Cos([ActualCost]) |
| Truncate([ActualCost]) |
Sin([ActualCost]) |
| Round([ActualCost], 2) |
Sqrt([ActualCost]) |
| Log([ActualCost], 2) |
Tan([ActualCost]) |
| Log10([ActualCost]) |
Truncate([ActualCost]) |
| Ln([ActualCost]) |
Log([ActualCost], 2) |
| IEEERemainder([ActualCost],1) |
Log10([ActualCost]) |
| Abs(-[ActualCost]) |
Ln([ActualCost]) |
| Acos(-0.1) |
IEEERemainder([ActualCost],50) |
| Asin(-0.1) |
Abs(-[ActualCost]) |
| Atan(-0.1) |
Acos(-0.1) |
| Max([ActualCost], [ActualDurationSeconds]) |
Asin(-0.1) |
| Min([ActualCost], [ActualDurationSeconds]) |
Atan(-0.1) |
| Sign(-10) |
Max([ActualCost], [ActualDurationSeconds]) |
| if(in(58, [ActualCost], [ExpectedCost], [ActualDurationSeconds]), 1, 2) |
Min([ActualCost], [ActualDurationSeconds]) |
| Ifs([ActualCost] > 50, 'bar', [ExpectedCost] > 75, 'baz', 'quux') |
if(DateDiff('mm', [Date], DateAdd('mm', 2, Now())) > 1, 'Mais que um mes', 'Menos que um mes') |
| Cos([ActualCost]) |
DateDiff('mm', [Date], DateAdd('mm', 1, Now())) |
| Sin([ActualCost]) |
DateAdd('yy', 5, [Date]) |
| Sqrt([ActualCost]) |
DateAdd('yy', -5, [Date]) |
| Tan([ActualCost]) |
DateAdd('dd', 15, DateAdd('mm', 8, DateAdd('yy', -5, [Date]))) |
| Log([ActualCost], 2) |
Month(Now()) |
| Log10([ActualCost]) |
Year(Now()) |
| Ln([ActualCost]) |
Day(Now()) |
| Substring(Now(),4, 4) |
|
| Substring('Concat'('TESTEOS1234',Now()),4, 20) |
|
Guardar ou partilhar este artigo