예제 #1
0
        /// <summary>
        /// Vytvori z rozvrhovych akci konkretni casove akce - vztahujici se vzdy ke konkretnimu dni
        /// </summary>
        /// <param name="rozvrhovaAkce"></param>
        public void VytvorCasoveAkce(RozvrhovaAkce rozvrhovaAkce)
        {
            DateTime indexer  = rozvrhovaAkce.PocatecniDen;
            DateTime posledni = rozvrhovaAkce.KonecnyDen;

            posledni = posledni.AddHours(rozvrhovaAkce.HodinaOd);
            posledni = posledni.AddMinutes(rozvrhovaAkce.MinutaOd);
            int perioda = (int)rozvrhovaAkce.Tyden;

            do
            {
                DateTime zacatek = indexer;
                zacatek = zacatek.AddHours(rozvrhovaAkce.HodinaOd);
                zacatek = zacatek.AddMinutes(rozvrhovaAkce.MinutaOd);
                DateTime konec = indexer;
                konec = konec.AddHours(rozvrhovaAkce.HodinaDo);
                konec = konec.AddMinutes(rozvrhovaAkce.MinutaDo);
                bool pridejNormalne = true;
                if (Uzivatel.ChceIHarmonogram == true)
                {
                    ZpracujRozvrhovouAkciDlePokynuHarmonogramu(indexer, out pridejNormalne);
                }
                if (pridejNormalne)
                {
                    Uzivatel.ZaznamyProGoogleKalendar.Add(new Zaznam(zacatek, konec, rozvrhovaAkce));
                }

                indexer = indexer.AddDays(perioda);
            } while (indexer < posledni);
        }
예제 #2
0
        public void PridejNovouMisnost(RozvrhovaAkce rozvrhovaAkce)
        {
            VydolovavacMisnosti mistnosti = new VydolovavacMisnosti();

            if (mistnosti.NactiXMLZeStagu(Uzivatel.UrlSkoly + Stringy.urlMisnosti1 + rozvrhovaAkce.Mistnost + Stringy.urlMistnosti2Cast + rozvrhovaAkce.Budova))
            {
                mistnosti.ZiskejData();
            }
        }
        public TimetableDetailPage()
        {
            InitializeComponent();

            var akce = new RozvrhovaAkce
            {
                Nazev = "TestAction"
            };

            viewModel      = new TimetableDetailViewModel(akce);
            BindingContext = viewModel;
        }
        public TimetableDetailViewModel(RozvrhovaAkce akce = null)
        {
            Title = akce?.Nazev;
            Akce  = akce;

            Students = new ObservableCollection <User>();

            LoadStudentsCommand      = new Command(async() => await ExecuteLoadStudentsCommand());
            SendMessageCommand       = new Command(async() => await ExecuteSendMessageCommand());
            SendRatingRequestCommand = new Command(async() => await ExecuteSendRatingRequestCommand());

            SendButtonText          = "Send message";
            SendRatingReqButtonText = "Send lection rating request";

            ExecuteLoadStudentsCommand();
        }
예제 #5
0
        /// <summary>
        /// Vytvoří z rozvrhové akce normalizovanou akci
        /// </summary>
        /// <param name="akce">Rozvrhová akce</param>
        public NormalizovanaAkce(RozvrhovaAkce akce)
        {
            this.Akce = akce;
            Tyden     = akce.TydenZkr;
            TydenOd   = akce.TydenOd;
            TydenDo   = akce.TydenDo;
            if (!(akce.HodinaOd == null || akce.HodinaDo == null))
            {
                NormZacatek = akce.HodinaOd.GetValueOrDefault();
                NormKonec   = akce.HodinaDo.GetValueOrDefault();
            }
            else
            {
                var hodinaZac = akce.HodinaSkutOd.Hour;
                var minutaZac = akce.HodinaSkutOd.Minute;
                var hodinaKon = akce.HodinaSkutDo.Hour;
                var minutaKon = akce.HodinaSkutDo.Minute;

                if (minutaZac == 0 && minutaKon == 50) //když je jedná o normální akci začátek v celou a konec v 50 ale nemá to vyplněné
                {
                    NormZacatek   = hodinaZac - 6;
                    NormKonec     = hodinaKon - 6;
                    akce.HodinaOd = NormZacatek;
                    akce.HodinaDo = NormKonec;
                }
                else
                {
                    if (minutaZac != 0)
                    {
                        hodinaZac++;
                    }

                    if (minutaKon == 0)
                    {
                        hodinaKon--;
                    }
                    if (minutaKon > 50 && minutaKon <= 59)
                    {
                        hodinaKon++;
                    }

                    NormZacatek = hodinaZac - 6;
                    NormKonec   = hodinaKon - 6;
                    //Debug.WriteLine("["+akce.Katedra + "/" + akce.Predmet+"] "+akce.HodinaSkutOd.Hour +":"+akce.HodinaSkutOd.Minute+" - "+akce.HodinaSkutDo.Hour+":"+akce.HodinaSkutDo.Minute+" >> "+normZacatek+" - "+normKonec);
                }
            }
        }
예제 #6
0
        /// <summary>
        /// Vrati pocet skutecnych hodin vyucovanych na danem predmetu a tedy i rozvrhove akci, ktera pod nej spada.
        /// Vhodne pouze pro ATYPicke predmety!
        /// </summary>
        /// <param name="ra">Rozvrhova akce jejiz pocet hodin chceme zjistit.</param>
        /// <returns>Pocet hodin.</returns>
        private int GetNoOfHoursForATYP(RozvrhovaAkce ra)
        {
            switch (ra.TypAkceZkr)
            {
            case "Př":
                return(ra.PredmetRef.HodinZaSemestrPr);

            case "Cv":
                return(ra.PredmetRef.HodinZaSemestrCv);

            case "Se":
                return(ra.PredmetRef.HodinZaSemestrSe);

            default:
                Debug.WriteLine(string.Format("Nepodarilo se ziskat pocet hodin ATYPu {0}/{1}", ra.Katedra, ra.Predmet));
                return(0);
            }
        }
예제 #7
0
        /// <summary>
        /// Vrati maximalni velikost skupiny ATYP predmetu.
        /// Vhodne pouze pro ATYPicke predmety!
        /// </summary>
        /// <param name="ra">Rozvrhova akce, ktera spada pod ATYP predmet.</param>
        /// <returns>Maximalni velikost skupiny dane akce. Muze byt i null!</returns>
        private int?GetGroupMaxSizeForATYP(RozvrhovaAkce ra)
        {
            switch (ra.TypAkceZkr)
            {
            case "Př":
                return(ra.PredmetRef.VelikostSkupinyPr);

            case "Cv":
                return(ra.PredmetRef.VelikostSkupinyCv);

            case "Se":
                return(ra.PredmetRef.VelikostSkupinySe);

            default:
                Debug.WriteLine(string.Format("Nepodarilo se ziskat maximalni velikost skupiny ATYPu {0}/{1}", ra.Katedra, ra.Predmet));
                return(null);
            }
        }
        /// <summary>
        /// Spracování formuláře pro tvorbu rozvrhové akce
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="args"></param>
        private void SaveRozvrhovaAkce(object sender, Form args)
        {
            RozvrhovaAkceForm raf = (RozvrhovaAkceForm)args;

            if (raf.GetExit() == false)
            {
                int           newId = RozvrhovaAkceManager.FindTopId() + 1;
                RozvrhovaAkce akce  = new RozvrhovaAkce(newId, raf.GetPredmet(), raf.GetTypVyuky(), raf.GetVyucujici(), raf.GetMistnost(), raf.GetDen(), raf.GetZacatek(), raf.GetDelka());
                RozvrhovaAkceManager.Save(akce);
                foreach (KeyValuePair <int, StudijniSkupina> skupina in raf.GetStudijniSkupiny())
                {
                    RozvrhovaAkceManager.AddStudijniSkupina(akce, skupina.Value);
                }
            }
            else
            {
                // Formulář přerušen
            }
        }
예제 #9
0
        /// <summary>
        /// Vypocte a ulozi do vystupni tridy zatez na vyuku analyzovane SRA, ktera obsahuje jeden atypicky predmet.
        /// </summary>
        private void ComputeSimpleATYPOnusDistribution(RozvrhovaAkce ra)
        {
            SetRoakIdnoSharedUtility(ra); // Podobne, jako u radnych predmetu, si nastavim rozdeleni zateze mezi katedry

            // Kvuli sdilene zatezi na vyuku predmetu budu pridavat zatez pro kazdou katedru
            foreach (string dept in roakIdnoSharedUtility[ra.RoakIdno].Keys)
            {
                int groupMaxSize = GetGroupMaxSizeForATYP(ra).GetValueOrDefault();

                if (groupMaxSize == 0)
                {
                    // Pokud je groupMaxSize, potom pocitame s daty pro cely predmet - Pouze pro jistotu, nemolo by byt pouzito

                    // ke kazdemu studentovi
                    foreach (Student student in studentsOnRoakIdno[ra.RoakIdno])
                    {
                        // Spocteme zatez na vyuku jednoho studenta, kde vsichni zapsani studenti jsou v jedne skupine
                        double onus = ComputeATYPOnus(ra.Obsazeni, roakIdnoSharedUtility[ra.RoakIdno][dept], GetNoOfHoursForATYP(ra));

                        onusDistribution.Pridat(student, dept, onus);   // zapis do vystupni tridy
                    }
                }
                else
                {
                    // Pokud groupMaxSize neni 0, musime spocitat zatez na vyuku KAZDE skupiny

                    // ke kazdemu studentovi
                    foreach (Student student in studentsOnRoakIdno[ra.RoakIdno])
                    {
                        //TODO: Pri vypoctu zanedbavam, ze posledni skupina nemusi mit maximalni pocet studentu

                        // Spocteme si zatez na vyuku jednoho studenta ve skupine maximalni velikosti
                        double onus = ComputeATYPOnus(groupMaxSize, roakIdnoSharedUtility[ra.RoakIdno][dept], GetNoOfHoursForATYP(ra));

                        onusDistribution.Pridat(student, dept, onus);   // zapis do vystupni tridy
                    }
                }
            }
        }
예제 #10
0
        /// <summary>
        /// Funkce, rozdělí rozvrhovou akci do slovníku podle budovy,místnosti a dne ve kterém se koná
        /// </summary>
        private static void RozdelAkce(
            RozvrhovaAkce akce,
            ref Dictionary <Tuple <string, string, string>, List <NormalizovanaAkce> > rozdelene,
            ref Dictionary <string, List <string> > budovyMistnosti)
        {
            var denBudMist = new Tuple <string, string, string>(akce.DenZkr, akce.Budova, akce.Mistnost);

            if (!rozdelene.ContainsKey(denBudMist))
            {
                rozdelene.Add(denBudMist, new List <NormalizovanaAkce>());
            }
            rozdelene[denBudMist].Add(new NormalizovanaAkce(akce));

            if (!budovyMistnosti.ContainsKey(akce.Budova))
            {
                budovyMistnosti.Add(akce.Budova, new List <string>());
            }
            if (!budovyMistnosti[akce.Budova].Contains(akce.Mistnost))
            {
                budovyMistnosti[akce.Budova].Add(akce.Mistnost);
            }
        }
예제 #11
0
        /// <summary>
        /// Nastavi do globalni promenne pro zadanou rozvrhovou akci rozdeleni zateze na vyuku mezi jednotlive katedry.
        /// </summary>
        private void SetRoakIdnoSharedUtility(RozvrhovaAkce ra)
        {
            // Pro rozvrhovou akci si vytahnu jeji typ (Pr, Cv, Se) a podle toho zjistim
            // z predmetu, ke kteremu patri, jaky maji na vyuce podil jednotlive katedry (staci jen prekopirovat).
            switch (ra.TypAkceZkr)
            {
            case "Př":
                roakIdnoSharedUtility.Add(ra.RoakIdno, ra.PredmetRef.PodilKatedryPrednaska);
                break;

            case "Cv":
                roakIdnoSharedUtility.Add(ra.RoakIdno, ra.PredmetRef.PodilKatedryCviceni);
                break;

            case "Se":
                roakIdnoSharedUtility.Add(ra.RoakIdno, ra.PredmetRef.PodilKatedrySeminar);
                break;

            default:
                //TODO: Predmety typu SZZ maji toto pole prazdne! Jak osetrit?
                break;
            }
        }
예제 #12
0
        /// <summary>
        /// Novy zaznam rozvrhove akce.
        /// </summary>
        /// <param name="start"></param>
        /// <param name="konec"></param>
        /// <param name="rozvrhovaAkce"></param>
        public Zaznam(DateTime start, DateTime konec, RozvrhovaAkce rozvrhovaAkce)
        {
            this.Start   = start;
            this.Konec   = konec;
            this.Titulek = rozvrhovaAkce.Katedra + @"/" + rozvrhovaAkce.Predmet + " - " + rozvrhovaAkce.TypAkce;
            this.TypAkce = rozvrhovaAkce.TypAkce;

            if (rozvrhovaAkce.Budova == null || rozvrhovaAkce.Mistnost == null || rozvrhovaAkce.Budova == "" || rozvrhovaAkce.Mistnost == "")
            {
                this.MistoPopis = "Bez přesné lokace. " + rozvrhovaAkce.Budova + " " + rozvrhovaAkce.Mistnost;
                return;
            }
            if (!Uzivatel.Mistnosti.ContainsKey(rozvrhovaAkce.Budova + rozvrhovaAkce.Mistnost))
            {
                PridejNovouMisnost(rozvrhovaAkce);
            }
            if (Uzivatel.Mistnosti.ContainsKey(rozvrhovaAkce.Budova + rozvrhovaAkce.Mistnost))
            {
                this.MistoPopis = Uzivatel.Mistnosti[rozvrhovaAkce.Budova + rozvrhovaAkce.Mistnost].ToString();
                this.MistoUrl   = Uzivatel.Mistnosti[rozvrhovaAkce.Budova + rozvrhovaAkce.Mistnost].UrlBudova;
            }

            this.Popis = "Předmět: " + rozvrhovaAkce.Nazev + "\nMísto: " /* + rozvrhovaAkce.Budova + @"/" + rozvrhovaAkce.Mistnost + ": "*/ + this.MistoPopis + "\nVyučující: " + rozvrhovaAkce.Ucitel;
        }
예제 #13
0
 public RozvrhovaAkceManager(RozvrhovaAkce rozvrhovaAkce)
 {
     this.RozvrhovaAkce = rozvrhovaAkce;
 }
예제 #14
0
 /// <summary>
 /// Přidá jednu akci jako jednu SRA
 /// </summary>
 private static void PridejSRADoDatabaze(RozvrhovaAkce akce, ref STAG_Database data)
 {
     data.SuperRozvrhoveAkce.Add(new SRA(akce));
 }
        /// <summary>
        /// Předá managerovi položku k odstranění
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="rozvrhovaAkce"></param>
        private void DeleteRozvrhovaAkce(object sender, Model rozvrhovaAkce)
        {
            RozvrhovaAkce ra = (RozvrhovaAkce)rozvrhovaAkce;

            RozvrhovaAkceManager.Delete(ra);
        }