SetParent – czyli jak napisać plugin do tej wiadomości

Przy okazji rozbudowania funkcjonalności CRM4.0 potrzebowałem napisać plugin, którego zadaniem będzie wykonanie pewnej operacji w trakcie kiedy zmieni się Menedżer użytkownika.

Dla przypomnienia: Pole Menedżer jest widoczne na formatce użytkownika jednakże ustawienie jego wartości jest możliwe tylko i wyłączenie poprzez skorzystanie z funkcjonalności ukrytej w menu Akcje lub też wykonanie kodu związane z klasą SetParentSystemUserRequest:

image

Okazuje się, że narzędzie Plugin Registration Tool (PRT) nie udostępnia nam możliwości podłączenia się pod zdarzenie związane ze zmianą interesującego nas pola. Interesujące nas wiadomości nazywa się SetParent.

Nie ma jednak tego ukrytego co by odkryte może zostać i okazuje się, że w bazie danych CRM taką wiadomość można odkryć. Jak ?

Wszystkie wiadomości jakie CRM może przetwarzać są zapisane w tabeli SdkMessageBase. Jak wykonamy sobie następujące zapytanie SQL:

select * from SdkMessageBase where Name = 'SetParent'

Zobaczymy, że tabela zwróci nam jeden rekord. To co jest dla nas z tego wyniku najważniejsze to SdkMessageId. W kolejnym kroku musimy zaktualizować jedną kolumnę w tabeli SdkMessageFilterBase, aby wiadomość nam się pokazała. Całe zapytanie, które to wykonuje jest następujące:

update SdkMessageFilterBase set IsCustomProcessingStepAllowed =1 where SdkMessageId = '1ABEBB1B-EA3E-DB11-86A7-000A3A5473E8'

Jak już to będziemy mieli wykonane nie pozostaje nam nic innego jak przeładować PRT i ponownie spróbować stworzyć Step, które będzie powiązany z tą wiadomością:

image

Jak wygląda kod obsługi tej wiadomości  ? Oto przykład:


public class PreSetParent : IPlugin
{
public void Execute(IPluginExecutionContext context)
{
if (context.MessageName == "SetParent" && context.InputParameters.Properties.Contains(Attributes.UserId) && context.InputParameters.Properties.Contains(Attributes.ParentId))
{
Guid _userId = (Guid)context.InputParameters[Attributes.UserId];
Guid _parentId = (Guid)context.InputParameters[Attributes.ParentId];
}
}
}


InputParameters w IPluginExecutionContext zawiera w tym przypadku 4 właściwości. UserId oraz ParentId są odpowiednią identyfikatorem użytkownika oraz identyfikatorem Menedżera. Inne atrybuty można sobie podejrzeć debugując kod pluginu.



Rozwiązanie, które zaproponowałem jest w 100% niewspierane i korzystacie z niego na własną odpowiedzialność.