Skip Navigation LinksALVAO 10.1ALVAO Service DeskImplementace systému v organizaciVlastní úpravy a rozšířeníVlastní programová rozšířeníAutomatické akce na základě událostí na požadavku
Skip Navigation Links.
Skip Navigation Links
Skip Navigation Links.
%USERPROFILE%\Documents\ALVAO\Doc\Documentation\doc\cs\ALVAO_10_1\alvao_service_desk\implementation\customization\code_extensions\ticket_custom_actions_by_events.aspx
|
Automatické akce na základě událostí na požadavku
Automatické akce se mohou spouštět v těchto případech:
- Změna hodnoty položky požadavku (vlastní/systémová)
- Založení nového požadavku
- Vytvoření nové události
- Úprava události
- Odstranění události
- Načtení nové zprávy ze schránky služby
Pro funkčnost automatických akcí je nutné mít zapnutá
Vlastní programová rozšíření.
Upozornění:
Špatnou definicí automatické akce může být nenávratně poškozena databáze
ALVAO, proto vytváření a testování vždy provádějte na kopii databáze v
testovacím prostředí.
Příprava nové automatické akce
Ve složce s nainstalovanou ALVAO Service Desk WebService zkopírujte v
adresáři App_Code soubor CodeExtension_Template.cs a vhodně jej pojmenujte podle
funkčnosti, kterou akce provádí.
V nově vytvořeném souboru do ohraničeného bloku kódu zadejte definici nové
automatické akce implementací rozhraní ITicketAutoAction, resp. IActAutoAction a
v konstruktoru třídy akce nastavte hodnotu vlastnosti name (název automatické
akce).
Příklad
Definice třídy:
…
class AssignToTester : ITicketAutoAction
{
public string name;
public string Name
{
get { return name; }
set { name = value; }
}
public AssignToTester()
{
name = "Vyřešeno ve verzi – předat do
testu";
}
string sectionName = "Programové úpravy"; // Název služby, ve
které má být požadavek, aby se mohl předat testerům (příklad Akce prováděné
při změně položky požadavku)
string stateName = "Realizace"; // Název stavu, ve kterém má
být požadavek, aby se mohl předat testerům (příklad Akce prováděné při změně
položky požadavku)
string sectionName2 = "Programové úpravy"; // Název služby,
ve které se vytváří nový požadavek (příklad Akce prováděné při založení
nového požadavku)
string sectionNameForCreate = "Programové úpravy/Návrhy a
analýzy"; // Název služby, do které se má vytvořit požadavek pro návrh k
zakládanému požadavku (příklad Akce prováděné při založení nového požadavku)
}
…
Definice podmínek a vykonávaných operací pro automatickou akci
Upozornění:
Pokud v rámci automatické akce chcete použít jen některé z metod
implementovaného rozhraní, tak v těle ostatních metod z rozhraní vraťte
výjimku
NotImplementedException. Například takto:
public void OnTicketChanged(SqlConnection con, SqlTransaction trans, int
ticketId, int personId, string properties)
{
throw new NotImplementedException();
}
Akce prováděné při změně položky požadavku
Automatické akce je možné vykonávat při změně těchto položek:
tabulka.sloupec
|
Položka požadavku
|
tHdTicket.sHdTicketStateNotice
|
Stav
|
tHdTicket.liHdTicketSlaId
|
SLA
|
tHdTicket.dHdTicketDeadline
|
Termín
|
tHdTicket.liHdTicketHdSectionId
|
Služba
|
tHdTicket.iHdTicketUser
|
Žadatel |
tHdTicket.liHdTicketSolverPersonId
|
Řešitel
|
tHdTicket.sHdTicket
|
Název požadavku
|
tHdTicket.liHdTicketPriorityId
|
Priorita
|
tHdTicket.Impact
|
Dopad
|
tHdTicket.Urgency
|
Naléhavost
|
tHdTicket.mHdTicketNotice
|
Poznámky |
tHdTicket.sHdTicketCategory
|
Kategorie
|
tHdTicket.sHdTicketGroup
|
Skupina
|
tHdTicket.sHdTicketDeviceCode
|
Číslo zařízení
|
tHdTicket.liHdTicketNodeId
|
Zařízení
|
tHdTicket.FeedbackSolveSpeed
|
Rychlost řešení
|
tHdTicket.FeedbackProfessionality
|
Profesionalita
|
tHdTicket.FeedbackExpertise
|
Odbornost
|
tHdTicket.FeedbackComment
|
Komentáře a poznámky
|
tHdTicket.RelatedAccountId
|
Související organizace
|
tHdTicketCust.*
|
Vlastní položky |
Ve vytvořené třídě akce implementujte rozhraní
ITicketAutoAction a z něho metodu
OnTicketChanged. Vstupními parametry jsou:
- ticketId (číslo požadavku),
- personId (id osoby, která provedla událost na požadavku) – V některých
případech mohl být systém, pak je hodnota NULL,
- properties (změněné položky požadavku oddělené čárkou –
tabulka.sloupec).
V implementované metodě definujte jak podmínky pro vykonání operací, tak
samotné operace s požadavkem.
Příklad automatické akce při změně položky požadavku:
Předání požadavku řešiteli ze skupiny Testeři v případě, že
požadavek je ve službě Programové úpravy a ve stavu Realizace.
…
class AssignToTester : ITicketAutoAction
{
…
public void OnTicketChanged(SqlConnection con,
SqlTransaction trans, int ticketId, int personId, string properties)
{
if
(properties.Contains("tHdTicketCust.solvedInVersion"))
{
try
{
HelpdeskWebService sdws = new HelpdeskWebService();
// nacteni hodnot
string solvedInVersion = sdws.ReadColumn(ticketId, "tHdTicketCust",
"solvedInVersion");
string section = sdws.ReadColumn(ticketId, "TicketForeignKeyInfo",
"SectionName");
string state = sdws.ReadColumn(ticketId, "tHdTicket", "sHdTicketStateNotice");
// kontrola hodnot
if (!String.IsNullOrEmpty(solvedInVersion) && section == sectionName && state ==
stateName)
{
// nacteni dat
using (SqlCommand Cmd = new SqlCommand(@"SELECT TOP 1 TRP.liRolePersonPersonId
newSolverId
FROM tRolePerson TRP JOIN tRole TR ON TRP.liRolePersonRoleId=TR.iRoleId WHERE
TR.sRole = N'Testeři'", con, trans))
{
using(SqlDataReader reader = Cmd.ExecuteReader())
{
int newSolverId; // id noveho resitele pozadavku
if (reader.Read())
{
newSolverId =
int.Parse((reader["newSolverId"]).ToString());
// predani resiteli
sdws.AssignToSolver(ticketId,
newSolverId);
}
reader.Close();
}
}
}
}
catch (Exception ex)
{
throw ex;
}
}
}
… }
…
Celý příklad je ke stažení zde.
Pro spuštění příkladu se předpokládá přidání vlastní položky
solvedInVersion typu nvarchar do tabulky tHdTicketCust.
Akce prováděné při založení nového požadavku
Ve vytvořené třídě automatické akce implementujte rozhraní
ITicketAutoAction a z něho metodu
OnTicketCreated. Vstupními parametry jsou:
- ticketId (číslo požadavku),
- personId (id osoby, která požadavek založila – nemusí být vždy žadatel).
Příklad automatické akce při založení nového požadavku:
Při založení nového požadavku ve službě
Programové úpravy je zároveň založen
navázaný požadavek ve službě Programové
úpravy/Návrhy a analýzy pro tvorbu návrhu k
založenému požadavku.
…
class AssignToTester : ITicketAutoAction
{
…
public void OnTicketCreated(SqlConnection con,
SqlTransaction trans, int ticketId, int personId)
{
try
{
HelpdeskWebService sdws = new HelpdeskWebService();
// nacteni hodnot
bool createAnalysis;
if ((sdws.ReadColumn(ticketId, "tHdTicketCust", "createAnalysis")) != null)
createAnalysis = bool.Parse(sdws.ReadColumn(ticketId, "tHdTicketCust",
"createAnalysis"));
else
createAnalysis = false;
string section = sdws.ReadColumn(ticketId, "TicketForeignKeyInfo",
"SectionName");
string name = sdws.ReadColumn(ticketId, "tHdTicket", "sHdTicket");
// kontrola hodnot
if (section == sectionName2 && createAnalysis)
{
// založení požadavku na vytvoreni navrhu
int newTicket = sdws.CreateTicket(personId, personId, null, null,
sectionNameForCreate, null, name + " - návrh", null, null, null, null, null,
DateTime.Now.ToUniversalTime(), DateTime.Now.ToUniversalTime(), 7);
// vytvoreni vazby
using(SqlCommand Cmd = new SqlCommand(@"INSERT INTO TicketRelation
(BeginHdTicketId, EndHdTicketId, TicketRelationTypeId)
VALUES (@rootTicket, @newTicket, 2)", con, trans))
{
Cmd.Parameters.Add("@rootTicket", SqlDbType.Int).Value = ticketId;
Cmd.Parameters.Add("@newTicket", SqlDbType.Int).Value = newTicket;
Cmd.ExecuteNonQuery();
}
}
}
catch (Exception ex)
{
throw ex;
}
}
…
}
…
Celý příklad je ke stažení zde.
Pro spuštění příkladu se předpokládá přidání vlastní položky
solvedInVersion typu nvarchar do tabulky tHdTicketCust.
Akce prováděné při vytvoření události
Automatické akce je možné vykonat při těchto
situacích:
- Ruční vytvoření libovolné události příkazem Nová událost nebo Nová poznámka
v SD Console nebo WebApp.
- Odeslání zprávy příkazem Poslat zprávu, Odpovědět, atd. v SD Console nebo
WebApp.
- Vyčtení e-mailu ze schránky služby pomocí programu MailboxReader.
- Ruční načtení zprávy příkazem Načíst zprávy z MS Outlook v SD Console.
- Ruční načtení zprávy příkazem Uložit do deníku požadavku v Outlook Add-in.
- Vytvoření zakládající události při vzniku nového požadavku.
- Zavoláním webové metody CreateAct, případně CreateTicket, kde se vytváří
zakládající zpráva.
Ve vytvořené třídě automatické akce implementujte rozhraní
IActAutoAction a z něho metodu
OnActCreated. Vstupními parametry jsou:
- actId (id události),
- personId (id osoby, která událost vytvořila).
Příklad automatické akce při vytvoření události:
Při vytvoření události ve službě Programové
úpravy je tato událost přeposlána v e-mailu každému manažerovi na službě,
pokud není autorem ani příjemcem události.
…
class SendMailsAboutNewEvent : IActAutoAction
{
public string name;
public string Name
{
get { return name; }
set { name = value; }
}
public SendMailsAboutNewEvent()
{
name = "Nová událost - poslat emaily";
}
string section = "Programové úpravy"; // Název služby, na jejímž požadavku se
bude vytvářet událost
public void OnActChanged(SqlConnection con, SqlTransaction trans, int
ticketId, int personId, string properties) {
throw new NotImplementedException();
}
public void OnActRemoved(SqlConnection con, SqlTransaction trans, int
ticketId, int personId) {
throw new NotImplementedException();
}
public void OnActCreated(SqlConnection con, SqlTransaction trans, int actId,
int personId)
{
try
{
HelpdeskWebService sdws = new HelpdeskWebService();
// nacteni hodnot
int ticketId = 0, fromPersonId = 0;
string actFrom = "", actFromEmail = "", actTo = "", actToEmail = "",
actSubject = "", actPlainText = "";
using (SqlCommand Cmd = new SqlCommand(@"SELECT liActHdTicketId,
liActFromPersonId, sActFrom, sActFromEmail,
sActTo, sActToEmail, sAct, mActNotice FROM tAct WHERE iActId =
@actId", con, trans))
{
Cmd.Parameters.Add("@actId", SqlDbType.Int).Value = actId;
using (SqlDataReader reader = Cmd.ExecuteReader())
{
if (reader.Read())
{
ticketId =
int.Parse((reader["liActHdTicketId"]).ToString());
fromPersonId =
int.Parse((reader["liActFromPersonId"]).ToString());
actFrom = (reader["sActFrom"]).ToString();
actFromEmail = (reader["sActFromEmail"]).ToString();
actTo = (reader["sActTo"]).ToString();
actToEmail = (reader["sActToEmail"]).ToString();
actSubject = (reader["sAct"]).ToString();
actPlainText = "Dobrý den,\n\n na požadavku číslo " +
ticketId.ToString() + " byla vytvořena událost:\n\n" +
(reader["mActNotice"]).ToString();
}
reader.Close();
}
}
string sectionName = sdws.ReadColumn(ticketId,
"TicketForeignKeyInfo", "SectionName");
// kontrola hodnot
if (sectionName == section)
{
// nacteni dat
int sectionId = int.Parse(sdws.ReadColumn(ticketId, "tHdTicket",
"liHdTicketHdSectionId"));
string sectionEmail = sdws.ReadColumn(sectionId, "tHdSection",
"sHdSectionEmail");
List<string> recipients = new List<string>();
using (SqlCommand Cmd = new SqlCommand(@"select sPersonEmail from
vHdSectionManager
left join tPerson on iPersonId = liHdSectionManagerPersonId
where sPersonEmail is not null and liHdSectionManagerHdSectionId
= @sectionId", con, trans))
{
Cmd.Parameters.Add("@sectionId", SqlDbType.Int).Value =
sectionId;
using (SqlDataReader reader = Cmd.ExecuteReader())
{
string personEmail = "";
while (reader.Read())
{
personEmail = (reader["sPersonEmail"]).ToString();
if (!actTo.Contains(personEmail) &&
!actToEmail.Contains(personEmail) && !actFrom.Contains(personEmail) &&
!actFromEmail.Contains(personEmail))
recipients.Add(personEmail);
}
reader.Close();
}
}
//odeslani e-mailu
if (recipients.Count > 0)
sdws.SendMail(ticketId, sectionEmail, recipients, null,
actSubject, actPlainText, false, false, con, trans);
}
}
catch (Exception ex)
{
throw ex;
}
}
}
…
Celý příklad je ke stažení zde.
Akce prováděné při úpravě události
Automatické akce je možné vykonat při změně těchto položek:
ttabulka.sloupec |
PPoložka události |
tAct.dAct |
Datum |
tAct.liActKindId |
Komu |
tAct.sActTo |
Datum |
tAct.sAct |
Předmět |
tAct.mActNotice |
Text |
tDocument.liDocumentActId |
Přílohy |
tActHd.bActHdUserRead |
Zobrazit žadateli |
tAct.bWaitingForUser |
Čekání na žadatele |
tAct.nActWorkHours |
Práce |
tAct.nActTravelHours |
Čas na cestě |
tAct.nActTravelKm |
Vzdálenost |
tAct.bNoCharge |
Nefakturovat/td>
|
Ve vytvořené třídě automatické akce implementujte rozhraní
IActAutoAction a z něho metodu
OnActChanged. Vstupními parametry jsou:
- actId (id události),
- personId (id osoby, která událost změnila),
- properties (změněné položky události, oddělené čárkou –
tabulka.sloupec).
Akce prováděné při odstranění události
Automatické akce je možné vykonat při odstranění
všech zpráv a událostí.
Ve vytvořené třídě automatické akce implementujte rozhraní
IActAutoAction a z něho metodu
OnActRemoved. Vstupními parametry jsou:
- actId (id události),
- personId (id osoby, která událost odstranila).
Akce prováděné při načtení zprávy Automatické akce je možné vykonat při
načtení zprávy ze schránky služby ještě před uložením zprávy do deníku již
existujícího požadavku, resp. před vytvořením nového požadavku.
Ve vytvořené třídě automatické akce implementujte rozhraní
IMailMessageAutoAction a z něho metodu
OnMessageReceived. Vstupními parametry jsou:
- message (objekt se zprávou),
- sectionId (id služby, ve které byla zpráva vyčtena),
- ticketId (id požadavku, ke kterému zpráva podle předmětu patří, resp.
nula, pokud se jedná o vytvoření nového požadavku),
- fromPersonId (id odesílatele zprávy, resp. účtu Host, pokud
odesílatel zprávy nebyl mezi uživateli nalezen).
Z metody OnMessageReceived
vraťte návratovou hodnotu
true nebo false
určující, zda se má zpráva dále standardně
zpracovávat nebo ne.
Pokud je těchto automatických akcí implementováno více, volají se postupně
do té doby, dokud některá nevrátí hodnotu false,
přičemž není garantováno pořadí jejich volání.
Poznámka:
Pokud není zpráva po automatických akcích dále zpracována, do protokolu
událostí je o tom zapsáno varování.
Příklad automatické akce při načtení zprávy: Při vyčtení zprávy se u
existujících požadavků zkoumá text zprávy, zda neobsahuje příkaz pro předání
řešiteli „ASSIGNTO: jméno řešitele“. Pokud jej obsahuje a řešitel je podle jména
nalezen, požadavek se mu automaticky předá a zpráva nebude zaznamenána do deníku
požadavku. Jinak je zpráva zpracována standardním způsobem.
……
public class AssignToSolverByEmail : IMailMessageAutoAction
{
public string name;
public string Name
{
get { return name; }
set { name = value; }
}
public AssignToSolverByEmail()
{
name = "Přiřazení řešiteli přes email";
}
public bool OnMessageReceived(SqlConnection con, SqlTransaction trans,
Rebex.Mail.MailMessage message, int sectonId, int ticketId, int fromPersonId)
{
if (ticketId == 0)
return true;
if(message.BodyText != null)
{
int startIndex = message.BodyText.IndexOf("ASSIGNTO:");
if(startIndex >= 0)
{
int length = message.BodyText.IndexOf("\n", startIndex) - (startIndex
+ 9);
string user = message.BodyText.Substring(startIndex + 9, length).Trim();
using (SqlCommand Cmd = new SqlCommand(@"exec spPersonSearch
@sample, NULL, 0, NULL, '', 1", con, trans))
{
Cmd.Parameters.Add("@sample", SqlDbType.NVarChar).Value =
user;
using (SqlDataReader reader = Cmd.ExecuteReader())
{
if (reader.Read())
{
HelpdeskWebService sdws = new HelpdeskWebService();
int solverId = int.Parse((reader["PersonId"]).ToString());
sdws.AssignTicketToSolver(ticketId, solverId,
fromPersonId, string.Empty, null, true);
return false;
}
}
}
}
}
return true;
} }
…
Celý příklad je ke stažení zde.
Odeslání zprávy v rámci automatické akce
Pokud potřebujete v rámci automatické akce odeslat libovolnou zprávu,
využijte k tomu metodu SendMail s parametry popsanými níže. Odeslaná zpráva může
být také automaticky zapsána do deníku požadavku.
Popis parametrů metody SendMail.
Parametr |
Datový typ |
Popis |
Povinný |
ticketId |
int |
ID požadavku, ke kterému se má záznam vytvořit. |
Ano |
from |
string |
E-mail odesílatele. Pokud není zadán, odesilatelem je služba. |
Ne |
recipients |
string[] |
Pole příjemců zprávy. |
Ano |
cc |
string[] |
Pole příjemců kopie zprávy. |
Ne |
subject |
string |
Předmět zprávy. Pokud není zadán, použije se značka a název požadavku. |
Ne |
body |
string |
Zpráva (může být v HTML). |
Ano |
createAct |
bool |
Vytvořit událost v deníku požadavku. |
Ano |
notification |
bool |
Vytvořená událost v deníku bude mít druh oznámení. |
Ano |
connection |
SqlConnection |
Připojení k databázi. |
Ano |
transaction |
SqlTransaction |
Probíhající databázová transakce. |
Ne |
priority |
int |
Číslo vyjadřující prioritu zprávy ve frontě pro odesílání. Výchozí hodnota je nastavena na 10000.
Podrobnější informace viz popis sloupce Priority v tabulce MailMessage. |
Ne |
Poznámka:
Metoda může být využita i pro vlastní příkazy.
Tip:
Pro sestavení HTML zprávy je možné použít funkci:
string HtmlNotificationBody(string htmlBody), která htmlBody obalí
standardní obálkou.
Tip:
Celý e-mail je možno sestavit i samostatně pomocí objektu MailMessage a poté
použít přetíženou metodu:
public int SendMail(MailMessage msg, int ticketId,
bool createAct, bool notification, SqlConnection connection, SqlTransaction
transaction, int priority);
Takto lze odeslat zprávu s přílohami a příp. i obrázky v textu. /div>
Návratová hodnota
- ID vytvořené události, když je e-mail úspěšně odeslán a vytvořena událost.
- 0, když je e-mail úspěšně odeslán, ale nebyla vytvořena událost.
- -1, když e-mail není odeslán, například z důvodu chybně nastaveného SMTP
serveru.
- Jakákoliv výjimka, neboť nejsou v těle metody zachycovány ani obsluhovány.
Nenašli jste co jste hledali? Zeptejte se našeho týmu technické podpory.
|