/// <summary>
        /// Ukázka použití volání služeb generátoru přidělení
        /// </summary>
        public static void ExampleUsage()
        {
            string username = "******";             //ID uzivatele, melo by byt ziskano na frontendu (FE) prihlasenim
            UserID user     = new UserID(username); //uzivatel-je predavan serveru

            try
            {
                //vytvoreni senatu-informace o senatech musi byt nactene z databaze a zde vytvoreny jejich instance
                //Dochazi k volani konstruktoru na strane klienta, viz DataContractHelpers.cs, kde jsou tyto konstruktory implementovany
                Senate s1 = new Senate("INS-tester-1", true);  //senat, ktery je povoleny,zatizeni 100, pocet aktivnich pripadu 0
                Senate s2 = new Senate("INS-tester-2", false); //senat je zakazany-nebude pouzit v simulaci
                Senate s3 = new Senate("INS-tester-3", true);  //senat je povoleny,
                Senate s4 = new Senate("INS-tester-4", true);  //senat je povoleny,
                Senate s5 = new Senate("INS-tester-5", true);
                //po odkomentovani vyjimka-volana na strane klienta
                //Senate s6 = new Senate("INS-tester-6",true,120);//zpusobi vyjimku na strane klienta, nepovolena hodnota zatizeni 120
                AssignCaseParams par = new AssignCaseParams();
                par.User    = user;//nastav si uzivatele ktery provede akci
                par.Senates = new List <Senate>()
                {
                    s1, s2, s3, s4, s5
                };                      //musi se vytvorit seznam senatu pro ze kterých se bude vybírat
                //vyber algoritmu pro simulaci, na FE uzivatel vybere
                par.AlgorithmToUse = 0; //vyber algoritmu pro vyber-platne hodnoty k 10.1.2018 jsou 0,1

                for (int i = 0; i < 1; i++)
                {
                    par.CaseIdentificator = string.Format("CASE {0}", i);
                    var results = proxy_generation.AssignCase(par); //proved vyber
                    Console.WriteLine("Byl vybran senat: {0}", results);
                }
            }
            catch (FaultException <GeneratorServiceFault> fault)//odchytavani vyjimek ze serveru
            {
                ConsoleServerMessage(fault);
            }
            catch (Exception e)//odchytnuti vyjimky z klienta
            {
                ConsoleClientMessage(e);
            }
            finally
            {
                Console.WriteLine("Hotovo");
            }
        }
        /// <summary>
        ///  Metoda zapisuje úspěšně provedenou akci do tabulky akcí Action, navíc ukládá i parametry generování.
        /// </summary>
        /// <param name="user_id">Identifikátor uživatele</param>
        /// <param name="action_name">Jméno akce</param>
        /// <param name="gparams">Parametry generování k uložení</param>
        /// <param name="random_value">Generovaná náhodná hodnota</param>
        /// <param name="parray">Spočtené pole pravděpodobností</param>
        /// <param name="result">Vybraný senát</param>
        /// <remarks>
        /// Předpokládá se užití v případě logování úspěšné akce, kde se ukládají parametry akce (generování).
        /// Protože by měla být použita při úspěšné akci, není proveden test na existenci parametrů.
        /// </remarks>
        /// <remarks>
        /// Dochází k logování parametrů generování do tabulky GeneratingInfo a stavů (aktuální konfigurace) do tabulky State
        /// Do tabulky GeneratingInfo se ukládá: počet senátů, identifikátor použitého algoritmu,identifikátor případu, generovaná náhodná hodnota,vybraný senát a id k odkazu na rodičovskou tabulku Action.
        /// Do tabulky State se ukládá:identifikátor každého senátu, zda je povolený, jeho zatížení, počet aktivních případů, levá a pravá mez intervalu pravděpodobnosti a id k odkazu na rodičovskou tabulku Action.
        /// Pokud je senát nepovolen, tak je levá a pravá mez intervalu pravděpodobnosti nastavena na hodnotu 0.
        /// </remarks>
        public static void WriteGeneratingActionSuccess(string user_id, string action_name, AssignCaseParams gparams, double random_value, double [] parray, string result)
        {
            try
            {
                DateTime action_time = DateTime.Now;//zjisti cas
                Debug.WriteLine("LOGING: " + connectionstring);
                using (SqlConnection connection = new SqlConnection(connectionstring))
                {
                    connection.Open();                                                                          //otevri spojeni
                    //zapis do tabulky akci uspech
                    int action_id = WriteActionGetLastId(connection, user_id, action_name, action_time, false); //nenastala chyba, zjisti id
                    using (SqlCommand command = new SqlCommand(insertgenparams, connection))
                    {
                        // (@senates,@algorithm,@case,@randvalue,@senate,@action_id)
                        command.Parameters.AddWithValue("@senates", gparams.Senates.Count);    //pocet senatu
                        command.Parameters.AddWithValue("@algorithm", gparams.AlgorithmToUse); //pouzity algoritmus
                        command.Parameters.AddWithValue("@case", gparams.CaseIdentificator);   //identifikator pripadu
                        command.Parameters.AddWithValue("@randvalue", random_value);           //vylosovna hodnota
                        command.Parameters.AddWithValue("@senate", result);                    //vybrany senat
                        command.Parameters.AddWithValue("@action_id", action_id);              //id akce
                        command.ExecuteNonQuery();                                             //proved prikaz
                    }
                    //zapis informaci o jednotlivych senatech
                    int    counter = 0;
                    double left    = 0;
                    double right   = parray[0];             //prava mez
                    foreach (var senate in gparams.Senates) //pro kazdy senat pis stav
                    {
                        using (SqlCommand command = new SqlCommand(insertstates, connection))
                        {
                            // (@senate_id,@enabled,@senate_load,@case_count,@left_bound,@right_bound,@action_id)
                            command.Parameters.AddWithValue("@senate_id", senate.ID);           //id senatu
                            command.Parameters.AddWithValue("@enabled", senate.Enabled);        //zda byl povoleny
                            command.Parameters.AddWithValue("@senate_load", senate.Load);       //zatizeni senatu
                            command.Parameters.AddWithValue("@case_count", senate.ActiveCases); //pocet aktivnich pripadu

                            if (senate.Enabled)
                            {
                                command.Parameters.AddWithValue("@left_bound", left);   //leva mez intrvalu pravdepodobnosti senatu
                                command.Parameters.AddWithValue("@right_bound", right); //prava mez intrvalu pravdepodobnosti senatu
                            }
                            else//kdyz je senat zakazan, tak leva i prava hranice je 0
                            {
                                command.Parameters.AddWithValue("@left_bound", 0);    //leva mez intrvalu pravdepodobnosti senatu
                                command.Parameters.AddWithValue("@right_bound", 0);   //prava mez intrvalu pravdepodobnosti senatu
                            }
                            command.Parameters.AddWithValue("@action_id", action_id); //id akce
                            command.ExecuteNonQuery();                                //proved prikaz
                        }
                        if (senate.Enabled)                                           //pro povolene senaty posouvej hranici
                        {
                            counter++;
                            if (counter < parray.Length)
                            {
                                left  = right;
                                right = parray[counter];
                            }
                        }
                    }
                }
            }
            catch (Exception e)//LADENI:pokud se cokoliv pri logovani nepovede, je poslana informace klientovi
            {
                throw new FaultException <GeneratorServiceFault>(new GeneratorServiceFault("SimulationServiceLog: " + e.Message), new FaultReason(e.Message));
            }
        }