Skip Navigation LinksALVAO 10.4Rozšiřující modulyALVAO Service Desk Custom AppsAplikacePeriodické vlastní akce Skip Navigation Links.


Periodické vlastní akce

Vlastní akce je možné spouštět v pravidelném časovém intervalu. Systém spouští periodické vlastní akce každou hodinu.

Pro funkčnost automatických akcí je nutné mít zapnutá Vlastní programová rozšíření.

Upozornění:
Špatnou definicí vlastní akce může být nenávratně poškozena databáze ALVAO, proto akce vždy vytvářejte a testujte v testovacím prostředí, např. na kopii produkční databáze.
Tip:
Předpokladem pro vytvoření funkční automatické akce je dobrá znalost databáze ALVAO, Service Desk WebService API a Alvao.API.

Příprava nové periodické akce

V aplikaci vytvořte nový skript podle šablony IPeriodicAction a vhodně jej pojmenujte podle funkčnosti, kterou akce provádí.

V nově vytvořeném skriptu nastavte v konstruktoru třídy hodnotu vlastnosti Name (název vlastní akce).

Příklad

U vyřešených požadavků je kontrolováno, zda jim uplynula lhůta pro znovu otevření požadavku žadatelem (dny) a mají vypnutý automatický přechod do stavu Uzavřeno. V případě, že nejsou tyto požadavky do 14 dnů uzavřené, jsou uzavřeny automaticky.

1. část příkladu:


class AutoCloseInactiveTickets : IPeriodicAction
{
    public string Name { get; set;}

    public AutoCloseInactiveTickets()
    {
        Name = "Automatické uzavření vyřešených požadavků po uplynutí lhůty pro znovu otevření žadatelem";
    }
}

Definice podmínek a vykonávaných operací pro periodickou akci

Ve vytvořené třídě akce implementujte rozhraní IPeriodicAction a z něj metodu OnPeriod.

V implementované metodě definujte jak podmínky pro vykonání operací, tak samotné operace.

2. část příkladu:


class AutoCloseInactiveTickets : IPeriodicAction
{

   public void OnPeriod(SqlConnection con)
   {
       try
       {
           string sql = @"
           if object_id('tempdb..#list') is not null
             drop table #list
           create table #list (id int primary key clustered, done bit default 0)

           -- získání všech požadavků, které jsou vyřešené, uplynula jim lhůta pro znovu otevření požadavku žadatelem (dny) a mají vypnutý automatický přechod do stavu Uzavřeno
           insert #list (id)
           select
             t.iHdTicketId
           from tHdTicket t
             left join tHdSection s on s.iHdSectionId=t.liHdTicketHdSectionId
             join TicketState ts on ts.TicketStateBehaviorId=3 AND ts.TicketTypeId=s.TicketTypeId
           where t.dHdTicketResolved is not null
             and t.dHdTicketRemoved is null
             and ClosedDate is null
             and dateadd(day, isnull(s.nHdSectionUserReopenDays, 0), t.dHdTicketResolved)<getutcdate()

           -- zalogování do deníku a uzavření požadavků
           declare @id int, @spid int
           select @spid=iPersonId from tPerson where bPersonSystem=1
           while(exists(select 1 from #list where done=0))
           begin
             select top 1 @id=id from #list where done=0

             insert tAct (liActHdTicketId,liActFromPersonId,liActKindId,CreatedByPersonId,dAct,sAct,mActNotice,bNoCharge,bWaitingForUser,dRecordCreated)
             select @id,@spid,9,@spid,getutcdate(),N'Automatické uzavření požadavku',N'Požadavek byl automaticky uzavřen',0,0,getutcdate()

             exec spCloseHdTicket @id,@spid,1

             if @@ROWCOUNT = 1
             update tHdTicket set InternalTarget = null, InternalTargetDeadline = null where iHdTicketId = @id

             update #list set done=1 where id=@id
           end
           select id from #list
           truncate table #list
           drop table #list
           ";
           using (SqlCommand cmd = new SqlCommand(sql, con, null))
           {
               Global.Person SystemPerson = Global.Person.GetSystem(con, null);
               using (SqlDataReader reader = cmd.ExecuteReader())
               {
                   // spusteni akci na zaklade zmeny stavu pozadavku
                   HelpdeskWebService sdws = new HelpdeskWebService();
                   while (reader.Read())
                   {
                       int id = Int32.Parse(reader["id"].ToString());

                       try
                       {
                           sdws.OnTicketChanged(id, SystemPerson.Id, "tHdTicket.TicketStateId");
                       }
                       catch (Exception)
                       {
                           //Výjimka se ignoruje
                       }
                   }
                   reader.Close();
               }
           }
       }
       catch (Exception ex)
       {
           throw ex;
       }
   }

}

Příklad ke stažení: Example_AutoCloseInactiveTickets.zip

 

Nenašli jste co jste hledali? Zeptejte se našeho týmu technické podpory.