Skip Navigation LinksALVAO 10.0ALVAO 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_0\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
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:
…
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ř. 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
|
PPolož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
|
KKategorie
|
tHdTicket.sHdTicketGroup
|
Skupina
|
tHdTicket.dHdTicketUserDeadline
|
Požadovaný termín
|
tHdTicket.sHdTicketDeviceCode
|
Číslo zařízení
|
tHdTicket.liHdTicketNodeId
|
Zařízení
|
tHdTicket.sHdTicketHdBranch
|
Obor
|
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:
…
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;
}
}
}
…
}
…
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:
…
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;
}
}
…
}
…
Pro spuštění příkladu se předpokládá přidání vlastní položky
createAnalysis typu bit 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:
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;
}
}
}
…
Akce prováděné při úpravě události
Automatické akce je možné vykonat při změně těchto položek:
tabulka.sloupec |
Polož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 |
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).
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 |
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);
Takto lze odeslat zprávu s přílohami a příp. i obrázky v textu.
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.
|