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.


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í.
Tip:
Předpokladem pro vytvoření funkční automatické akce je dobrá znalost databáze ALVAO a rozhraní Service Desk WebService.

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.