Como implementar uma Smart Action do tipo Função de Extensibilidade?
É possível implementar uma Smart Action do tipo Função de Extensibilidade no ERP Primavera com o Visual Studio. Uma Smart Action de Extensibilidade permite injetar os seus próprios dados e prompt na chamada ao Pulse, bem como tratar a resposta do Pulse, tudo através da sua assembly de extensibilidade. Tem total controlo sobre o contexto enviado ao Pulse e o que acontece com o resultado. Após criar o projeto, é necessário adicionar referências à plataforma de extensibilidade e aos módulos com que irá trabalhar: Métodos 1. BeforeExecution Utilize o parâmetro smartActionName para encaminhar para a Smart Action correta e faça cast de businessEntity para o tipo de entidade de negócio (BE) esperado. Devolva um CustomSmartActionRequest preenchido com: Para nomes de Smart Action não reconhecidos devolva new CustomSmartActionRequest() vazio. 2. AfterExecution Recebe o nome da Smart Action e a resposta gerada pelo Pulse. Utilize este método para apresentar o resultado ao utilizador, escrever num campo, registar em log, ou desencadear qualquer lógica subsequente Após implementar e registar a assembly de extensibilidade, crie a Smart Action diretamente a partir do formulário alvo: Nota: o nome é a chave que encaminha a chamada para o bloco correto no método BeforeExecution — deve corresponder exatamente. A comparação deverá ser insensível a maiúsculas/minúsculas por convenção, conforme demonstrado no exemplo. Preparamos a seguinte checklist com todos os passos necessários para auxiliá-lo neste processo:Pré-Requisitos
Passo 1: Criar Projeto
Passo 2: Referências
• Primavera.Extensibility.CustomSmartAction.dll
• Primavera.Extensibility.Integration.dll
• Primavera.Extensibility.BusinessEntities.dll
• ErpBS100.dll
• StdPlatBS100.dll
Passo 3: Criar Classe
Método Quando é chamado Finalidade BeforeExecution(string smartActionName, T businessEntity) Antes da chamada ao Pulse Constrói e devolve o pedido: contextos e prompt AfterExecution(string smartActionName, string result) Após a chamada ao Pulse Trata o resultado gerado pelo Pulse Exemplo
using Primavera.Extensibility.BusinessEntities.Data;
using System;
using System.Collections.Generic;
using System.Data;
using System.Globalization;
namespace MyCompany.Extensibility
{
public class SmartAction : Primavera.Extensibility.CustomSmartAction.CustomSmartAction
{
public override CustomSmartActionRequest BeforeExecution(string smartActionName, T businessEntity)
{
if (smartActionName.Equals("Artigo", StringComparison.InvariantCultureIgnoreCase)
&& businessEntity is BasBE100.BasBEArtigo artigo)
{
var data = new DataTable();
data.Columns.AddRange(new[]
{
new DataColumn("Artigo"),
new DataColumn("Descricao"),
new DataColumn("Preco")
});
data.Rows.Add("A0001", "Item 1", "40.60");
data.Rows.Add("A0002", "Item 2", "20.33");
data.Rows.Add("A0003", "Item 3", "55.50");
data.Rows.Add("A0004", "Item 4", "35.20");
return new CustomSmartActionRequest()
{
Contexts = new List()
{
new CustomSmartActionContext()
{
Background = "Lista de artigos com preços em euros.",
Data = data
}
},
Prompt = "Qual é o artigo mais caro e qual é o seu preço?"
};
}
if (smartActionName.Equals("DocumentoVenda", StringComparison.InvariantCultureIgnoreCase)
&& businessEntity is VndBE100.VndBEDocumentoVenda documentoVenda)
{
return new CustomSmartActionRequest()
{
Contexts = new List()
{
new CustomSmartActionContext()
{
Background = "Documento de venda com dados do cliente, datas, totais e lista de artigos vendidos.",
Data = BuildSalesDocumentTable(documentoVenda)
}
},
Prompt = "Com base neste documento de venda, forneça uma análise do cliente, volume de vendas, descontos aplicados e valor final."
};
}
return new CustomSmartActionRequest();
}
public override void AfterExecution(string smartActionName, string result)
{
this.PSO.MensagensDialogos.MostraAviso(
"Resultado da Smart Action",
StdBE100.StdBETipos.IconId.PRI_Informativo,
result);
}
private DataTable BuildSalesDocumentTable(VndBE100.VndBEDocumentoVenda doc)
{
var dt = new DataTable();
dt.Columns.AddRange(new[]
{
new DataColumn("TipoDoc"), new DataColumn("Serie"), new DataColumn("NumDoc"),
new DataColumn("Cliente"), new DataColumn("Data"), new DataColumn("TotalMercadoria"),
new DataColumn("TotalDesconto"), new DataColumn("TotalIVA"), new DataColumn("OutrosEncargos"),
new DataColumn("TotalDocumento"), new DataColumn("NumLinha"), new DataColumn("Artigo"),
new DataColumn("Descricao"), new DataColumn("Quantidade"), new DataColumn("PrecUnit"),
new DataColumn("Desconto1"), new DataColumn("Desconto2"), new DataColumn("Desconto3")
});
int numLinha = 0;
foreach (VndBE100.VndBELinhaDocumentoVenda linha in doc.Linhas)
{
numLinha++;
dt.Rows.Add(
doc.Tipodoc, doc.Serie,
doc.NumDoc.ToString(CultureInfo.InvariantCulture),
doc.Entidade,
doc.DataDoc.ToString("yyyy-MM-dd", CultureInfo.InvariantCulture),
doc.TotalMerc.ToString("0.00", CultureInfo.InvariantCulture),
doc.TotalDesc.ToString("0.00", CultureInfo.InvariantCulture),
doc.TotalIva.ToString("0.00", CultureInfo.InvariantCulture),
doc.TotalOutros.ToString("0.00", CultureInfo.InvariantCulture),
doc.TotalDocumento.ToString("0.00", CultureInfo.InvariantCulture),
numLinha.ToString(CultureInfo.InvariantCulture),
linha.Artigo, linha.Descricao,
linha.Quantidade.ToString("0.00", CultureInfo.InvariantCulture),
linha.PrecUnit.ToString("0.00", CultureInfo.InvariantCulture),
linha.Desconto1.ToString("0.00", CultureInfo.InvariantCulture),
linha.Desconto2.ToString("0.00", CultureInfo.InvariantCulture),
linha.Desconto3.ToString("0.00", CultureInfo.InvariantCulture)
);
}
return dt;
}
}
Passo 4: Configurar Smart Action no ERP
Checklist