阻止编辑报价详细信息,但允许修改报价本身
本文关键字:修改 许修改 编辑 详细信息 | 更新日期: 2023-09-27 18:30:33
除
特定用户外,不应允许所有用户编辑或更新不满足特定条件的报价详细信息,但如果他们愿意,他们必须能够修改报价。
问题是,修改报价(即用户单击活动表单记录中的"修订"按钮)会触发报价详细信息的更新,我不知道如何识别正在发生的事情。
我目前的尝试是基于一个插件,其代码如下所示:
public class PreQuoteProductUpdate : Plugin
{
// I work with CRM Developer Tools to build plugins
// This goes in Update Message, Pre-Operation, Server Only, pre-image called "preImage"
protected void ExecutePreQuoteProductUpdate(LocalPluginContext localContext)
{
if (localContext == null)
{
throw new ArgumentNullException("localContext");
}
IPluginExecutionContext context = localContext.PluginExecutionContext;
IOrganizationService srv = localContext.OrganizationService;
Entity preImageEntity = (context.PreEntityImages != null && context.PreEntityImages.Contains(this.preImageAlias)) ? context.PreEntityImages[this.preImageAlias] : null;
try
{
PluginBody(context, srv, preImageEntity);
}
catch (Exception ex)
{
throw new InvalidPluginExecutionException("Quote Details Pre-Update", ex);
}
}
protected void PluginBody(IPluginExecutionContext context, IOrganizationService srv, Entity preImage)
{
if(IsRevising()) return;
CheckSomeCondition(context, srv);
if (preImage.Attributes.ContainsKey("ica_daconfigurazione") && preImage.GetAttributeValue<bool>("ica_daconfigurazione"))
{
CheckUser(context, srv);
}
}
protected void IsRevising()
{
// I have no clue about the logic to put here: see below.
}
protected void CheckSomeCondition(IPluginExecutionContext context, IOrganizationService srv)
{
var entity = (Entity)context.InputParameters["Target"];
// if some fields of entity contain some specific data, throw
// this always happens
}
protected void CheckUser(IPluginExecutionContext context, IOrganizationService srv)
{
//allowedUser is read from a configuration entity
var allowedUser = new Guid();
if (context.InitiatingUserId.Equals(serviceUser.Id) == false)
throw new InvalidPluginExecutionException("Can't edit quote details");
}
}
我知道(在Quote
插件中)我可以通过检查ParentContext
来知道正在进行修订,QuoteDetail
插件中是否有类似的东西?我试了一下,但我得到的只是NullReferenceException
扔给我。
我应该期望有State
/Status
可供检查吗?
有关我可能忽略的更多信息,请询问。
在 QuoteDetail
的 Pre Create
消息(阶段 20)上注册,并过滤不用于Quote
的父上下文。如果是,只需返回(实际上什么都不做)。这同样适用于QuoteDetail
的Update
消息。
两条消息都在 Quote
的ReviseQuote
消息的上下文中运行。
var parentContext = context.ParentContext;
// While there is a parent context...
while (parentContext != null) {
// When parent context is for "quote", return;
if (parentContext.PrimaryEntityName == "quote")
{
return;
}
// Assign parent's parent context to loop parent context.
parentContext = parentContext.ParentContext;
}