V tomto článku si ukážeme, jak můžeme z ObjectGears automaticky nechat posílat notifikace na uživatele, kteří nemají ObjectGears účet.
V našem příkladě budeme mít třídu aplikací (business-application) s vlastnostmi support_to (datum) a analysts (odkaz do jiné třídy ms-ad-users). Vztah tříd zachycuje následující schéma.
Použijeme automatické časové operace pro kontrolu pole support_to a odesílání notifikací kolegům v poli analysts ve stanovenou dobu před koncem podpory.
Pokud by v poli analysts byl odkaz na uživatele ObjectGears, mohli bychom příjemce motifikací jednoduše nastavit v detailu časové operace, tak že bychom vybrali tento sloupec.
Příjemci notifikací však nebudou uživatelé ObjectGears. Místo toho budou příjemci reprezentováni jen záznamy z jiné třídy, u nichž budeme mít uveden email. Odeslání notifikace pak budeme moci vyřešit dvěma způsoby. Skriptem v časové operaci nad třídou business-application, který si zjistí emaily ze třídy ms-ad-users nebo dotazem, který bude pro každou aplikaci vracet emaily oddělené čárkou ve zvláštním sloupci, a časovou operací nad tímto dotazem.
Možnost č.1 - Skript v časové operaci nad třídou
V časové operaci nastavíme filtr na záznamy, kde pole analysts není null. Na záložkách s vlastnimi operacemi pak nastavíme tento skript.
/*skript se podívá do násobného classlinku Analysts, který vede na třídu ms-ad-users - emaily jsou ve sloupci e-mail
Pošle upozornění end_of_support_reminder a nalinkuje odeslaný email na záznam dané aplikace.*/
var drl = OGActualDataRow.GetDR('analysts');
if ( drl != null && drl.Count > 0)
{
//příprava emailu
var m = OG.Email.CreateMessage();
var isAnyEmail = false;
for( var i = 0; i < drl.Count; ++i)
{
var email = drl[i]['e-mail'];
if ( !OG.IsNull(email))
{
m.AddTo(email);
isAnyEmail = true;
}
}
if (isAnyEmail)
{
var mIt = OG.Model.GetByCode('it');
m.Notification = OG.Notification.GetAll().GetDefaultByCode( mIt.Id, 'end_of_support_reminder');
//nalinkování emailu k záznamu aplikace
m.AssignEmailForDataRow = OGActualDataRow;
m.SendEmailAsOne = true; //odeslat jako jeden email
//m.SendEmailAsOne = false; //odeslat emaily samostatne
//nalinkování emailu k časové operaci jako původci odeslání
m.OwnerType = OG.Email.EmailOwnerType_AutomaticTimeOperationSend;
m.OwnerId = OGActualAto.Id;
OG.Email.Send(m);
}
}
Možnost č.2 - Dotaz vracející emaily a časová operace nad tímto dotazem
V tomto případě si data obou tříd transformujeme do dotazu a nad ním už jednoduše nastavíme časovou operaci. SQL dotazu:
SELECT t.*
FROM
(
SELECT ba.id, ba.support_to, CONVERT(varchar(10),ba.id) as ba_id, ba.name,
( STUFF((
SELECT ';' + us.[e-mail] AS [text()]
FROM {{:class.ms-ad-users:}} us
INNER JOIN DataRow{{:class.business-application.id:}}_{{:class.ms-ad-users.id:}}Link l
ON l.ColumnClassDefId = {{:class.business-application.column.analysts.id:}} and l.ReferentionId = ba.Id
WHERE us.Deleted is null
AND us.id = l.LinkReferentionId
/*ORDER BY f.Id*/
FOR XML PATH ('')
), 1, 1, '')
) emails
FROM {{:class.business-application:}} ba
) t
WHERE t.emails is not null