/// <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); }
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(); }
/// <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); } } }
/// <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); } }
/// <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 } }
/// <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 } } } }
/// <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); } }
/// <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; } }
/// <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; }
public RozvrhovaAkceManager(RozvrhovaAkce rozvrhovaAkce) { this.RozvrhovaAkce = rozvrhovaAkce; }
/// <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); }