public ActionResult Instrukcija(InstrukcijaModel model, string naredba) { // pohrani novi zahtjev if (naredba != null && naredba != "Traži") { using (var db = new ppij_databaseEntities()) { dogovor_termin zahtjev = new dogovor_termin(); int ID_instruktor = Int32.Parse(naredba); string id = "lokacija:" + ID_instruktor; int ID_lokacija = Int32.Parse(Request.Form[id].ToString()); try { zahtjev.ID_dogovor_termin = db.dogovor_termin.Select(d => d.ID_dogovor_termin).Max() + 1; } catch (InvalidOperationException) { zahtjev.ID_dogovor_termin = 0; } zahtjev.dogovor_status = 10; zahtjev.dogovor_ocijena = null; zahtjev.ID_instruktor = ID_instruktor; zahtjev.ID_klijent = db.Osoba.First(o => o.korisnicko_ime_osoba == User.Identity.Name).ID_osoba; zahtjev.datum_dogovor = model.Datum.AddHours(model.OdabraniSatID); zahtjev.ID_predmet = Int32.Parse((string)RouteData.Values["predmet_id"]); zahtjev.trajanje = model.OdabranoTrajanjeID; zahtjev.ID_lokacija = ID_lokacija; zahtjev.dogovor_ocijena = 0; db.dogovor_termin.Add(zahtjev); db.SaveChanges(); } } List <OpisInstrukcije> opisi = new List <OpisInstrukcije>(); using (var db = new ppij_databaseEntities()) { // datetime pocetka i zavrsetka DateTime pocetak = new DateTime(model.Datum.Year, model.Datum.Month, model.Datum.Day, model.OdabraniSatID, 0, 0); DateTime zavrsetak = pocetak.AddHours(model.OdabranoTrajanjeID); // lista svih termina koji obuhvaćaju interval [pocetak, zavrsetak] List <int> termini = new List <int>(); for (int i = 0; i < model.OdabranoTrajanjeID; i++) { DateTime termin = pocetak.AddHours(i); int dan = (int)termin.DayOfWeek; if (dan == 0) { dan += 7; // pretvori nedjelju iz 0 u 7 } int sat = termin.Hour; int blok = (dan * 100 + sat); termini.Add(blok); } // uzmi sve instruktore koji predaju navedeni predmet int ID_predmet = Int32.Parse((string)RouteData.Values["predmet_id"]); List <osoba_predmet> instrukcije = db.osoba_predmet.Where(i => i.ID_predmet == ID_predmet).ToList(); // TODO: uzmi instruktore koji su aktivni model.Predmet = db.Predmet.First(p => p.ID_predmet == ID_predmet); // makni sebe iz liste instruktora (LOL) Osoba korisnik = db.Osoba.Where(o => o.korisnicko_ime_osoba == User.Identity.Name).FirstOrDefault(); instrukcije = instrukcije.Where(i => i.Osoba.ID_osoba != korisnik.ID_osoba).ToList(); Debug.WriteLine("---------------"); // izracunaj opise instruktora foreach (osoba_predmet instrukcija in instrukcije) { OpisInstrukcije opis = new OpisInstrukcije(); opis.Instruktor = instrukcija.Osoba; // pogledaj koji instruktori imaju barem jedan termin postavljen kao ne slobodan Osoba instruktor = instrukcija.Osoba; List <int> slobodni_termini = instruktor.Termin.Select(t => t.ID_termin).ToList(); if (!TerminiSlobodni(slobodni_termini, termini)) { opis.Status = "NEDOSTUPAN"; } if (opis.Status == null) { // pogledaj koji instruktori imaju preklapanja sa vec postojecim dogovorenim terminima bool preklapanje = false; List <dogovor_termin> dogovoreni_termini = instruktor.dogovor_termin .Where(d => d.dogovor_status == 1 || d.dogovor_status == 11).ToList(); foreach (dogovor_termin dogovoren_termin in dogovoreni_termini) { DateTime pocetak_termina = (DateTime)dogovoren_termin.datum_dogovor; DateTime zavrsetak_termina = pocetak_termina.AddHours((int)dogovoren_termin.trajanje); if ((pocetak >= pocetak_termina && pocetak < zavrsetak_termina) || (zavrsetak > pocetak_termina && zavrsetak <= zavrsetak_termina) || (pocetak <= pocetak_termina && zavrsetak >= zavrsetak_termina)) { preklapanje = true; break; } } if (preklapanje) { opis.Status = "REZERVIRAN"; } } if (opis.Status == null) { // provjeri da li je već isti zahtjev tom instruktoru DateTime termin = model.Datum.AddHours(model.OdabraniSatID); Debug.WriteLine(termin); int vec_poslan = db.dogovor_termin .Where(d => d.Osoba1.korisnicko_ime_osoba == User.Identity.Name) .Where(d => d.ID_instruktor == instrukcija.Osoba.ID_osoba) .Where(d => d.datum_dogovor == termin) .Where(d => d.trajanje == model.OdabranoTrajanjeID) .Where(d => d.ID_predmet == ID_predmet).Count(); if (vec_poslan != 0) { Debug.WriteLine("preklapanja:"); Debug.WriteLine(opis.Instruktor.prezime_osoba + ":" + opis.Status); vec_poslan = db.dogovor_termin .Where(d => d.Osoba1.korisnicko_ime_osoba == User.Identity.Name) .Where(d => d.ID_instruktor == instrukcija.Osoba.ID_osoba) .Where(d => d.datum_dogovor == termin) .Where(d => d.trajanje == model.OdabranoTrajanjeID) .Where(d => d.ID_predmet == ID_predmet) .Where(d => d.dogovor_status == 0 || d.dogovor_status == 3 || d.dogovor_status == 2 || d.dogovor_status == 20).Count(); if (vec_poslan != 0) { opis.Status = "OTKAZAN"; } else { opis.Status = "POSLAN"; } } else { Debug.WriteLine("nema preklapanja:"); Debug.WriteLine(opis.Instruktor.prezime_osoba + ":" + opis.Status); opis.Status = "SLOBODAN"; } } // izracunaj prosjecnu ocjenu iz predmeta List <int> ocjene = db.dogovor_termin.Where(i => i.ID_instruktor == opis.Instruktor.ID_osoba && i.ID_predmet == ID_predmet && i.dogovor_ocijena != null) .Select(i => (int)i.dogovor_ocijena).ToList(); opis.Ocjena = 1.0 * ocjene.Sum(x => Convert.ToInt32(x)) / ocjene.Count; if (double.IsNaN(opis.Ocjena)) { opis.Ocjena = 0; } // nadji broj instrukcija iz predmeta opis.BrojInstrukcija = db.dogovor_termin.Where(i => i.ID_instruktor == opis.Instruktor.ID_osoba && i.ID_predmet == ID_predmet && DateTime.Now > i.datum_dogovor && i.dogovor_status == 1).Count(); // izracunaj cijenu (trajanje * cijena) opis.Cijena = (decimal)instrukcija.cijena * model.OdabranoTrajanjeID; // stavi listu lokacija u combo box opisa opis.Lokacije = instrukcija.Osoba.Lokacija.ToList(); opisi.Add(opis); } } // TODO : filtriraj po minimalnoj ocjeni, minimalnom broju instrukcija, rasponu cijene, if (model.Ime != null) { opisi = opisi.Where(i => i.Instruktor.ime_osoba.ToUpper().Contains(model.Ime.Trim().ToUpper())).ToList(); } if (model.Prezime != null) { opisi = opisi.Where(i => i.Instruktor.prezime_osoba.ToUpper().Contains(model.Prezime.Trim().ToUpper())).ToList(); } opisi = opisi.Where(i => i.BrojInstrukcija >= model.BrojInstrukcija && i.Ocjena >= model.Ocjena).ToList(); model.Opisi = opisi; return(View(model)); }
public ActionResult Index(Models.PostavkeModel model) { using (ppij_databaseEntities data = new ppij_databaseEntities()) { Osoba osoba = data.Osoba.Where(o => o.korisnicko_ime_osoba == User.Identity.Name).FirstOrDefault(); //Debug.WriteLine("tab: " + model.trenutniTab); if (ModelState.IsValid) { String trenutniTab = model.trenutniTab; if (trenutniTab.Equals("11") || trenutniTab.Equals("12")) { if (model.mojeVlastiteInstrukcije != null && model.mojeVlastiteInstrukcije.dogovoreni_termini_kao_klijent != null) { foreach (dogovor_term_osoba dto in model.mojeVlastiteInstrukcije.dogovoreni_termini_kao_klijent) { dogovor_termin dogovor = data.dogovor_termin.Where(d => d.ID_dogovor_termin == dto.termin.ID_dogovor_termin).FirstOrDefault(); if (dto.seen == true) { if (dogovor.dogovor_status == 3) { dogovor.dogovor_status = 0; } else if (dogovor.dogovor_status == 11) { dogovor.dogovor_status = 1; } } if (dto.odustani == true) { if (dogovor.dogovor_status == 10) { dogovor.dogovor_status = 20; } else if (dogovor.dogovor_status == 11 || dogovor.dogovor_status == 1) { dogovor.dogovor_status = 2; } //Debug.WriteLine("odustano od dogovora: " + dogovor.ID_dogovor_termin); } if (dogovor.dogovor_ocijena == null || dto.termin.dogovor_ocijena != dogovor.dogovor_ocijena) { dogovor.dogovor_ocijena = dto.termin.dogovor_ocijena; } data.SaveChanges(); } } if (model.mojeVlastiteInstrukcije != null && model.mojeVlastiteInstrukcije.dogovoreni_termini_kao_instruktor != null) { foreach (dogovor_term_osoba dto in model.mojeVlastiteInstrukcije.dogovoreni_termini_kao_instruktor) { dogovor_termin dogovor = data.dogovor_termin.Where(d => d.ID_dogovor_termin == dto.termin.ID_dogovor_termin).FirstOrDefault(); if (dto.seen == true) { if (dogovor.dogovor_status == 2) { dogovor.dogovor_status = 0; } else if (dogovor.dogovor_status == 10) { dogovor.dogovor_status = 11; } } if (dto.odustani == true) { if (dogovor.dogovor_status == 1 || dogovor.dogovor_status == 11 || dogovor.dogovor_status == 10) { dogovor.dogovor_status = 3; } //Debug.WriteLine("odustano od dogovora: " + dogovor.ID_dogovor_termin); } } } data.SaveChanges(); } else if (trenutniTab.Equals("21") || trenutniTab.Equals("22")) { /*foreach (String t in model.mojeVlastiteInstrukcije.mojiTermini) * { * Debug.WriteLine("post: " + t); * }*/ model.mojeVlastiteInstrukcije.mojiTermini = model.mojeVlastiteInstrukcije.mojiTermini.FirstOrDefault().Split(',').ToList(); List <Termin> toBeDel = new List <Termin>(); foreach (Termin s in osoba.Termin) //provjera starih termina - da li su još aktualni { //Debug.WriteLine("check to be deleted: " + s.ID_termin); if (model.mojeVlastiteInstrukcije.mojiTermini.Contains(s.ID_termin.ToString()) == false) { //Debug.WriteLine("to be deleted: " + s.ID_termin); toBeDel.Add(s); } } foreach (Termin t in toBeDel) { osoba.Termin.Remove(t); } data.SaveChanges(); foreach (String s in model.mojeVlastiteInstrukcije.mojiTermini) //provjera novih termina - koje treba dodati u bazu { //Debug.WriteLine("check to be added: " + s); if (s.Length > 0) { int id = Int32.Parse(s); if (osoba.Termin.Where(st => st.ID_termin == id).Count() == 0) { //Debug.WriteLine("to be added: " + s); Termin ter = data.Termin.Where(t => t.ID_termin == id).FirstOrDefault(); osoba.Termin.Add(ter); } } } } else if (trenutniTab.Equals("4")) { if (Crypto.VerifyHashedPassword(osoba.lozinka, model.changePassword.OldPassword + osoba.salt) == false) { ModelState.AddModelError("error_old_password", "pogrešna lozinka"); return(View()); } string salt = Crypto.GenerateSalt(12); osoba.lozinka = Crypto.HashPassword(model.changePassword.NewPassword + salt); osoba.salt = salt; } else if (trenutniTab.Equals("3")) { if (osoba.razina_prava != 0) { if (model.ostalePostavke.instruktor == true) { osoba.razina_prava = 1; } else { osoba.razina_prava = 2; } } if (model.mojeVlastiteInstrukcije.MojeLokacijeJson != null) { List <lokacijeJsonObject> lokacijeObj = JsonConvert.DeserializeObject <List <lokacijeJsonObject> >(model.mojeVlastiteInstrukcije.MojeLokacijeJson); if (lokacijeObj != null) { List <Lokacija> lokacije = new List <Lokacija>(); foreach (lokacijeJsonObject objekt in lokacijeObj) { Lokacija lok = new Lokacija() { Geo_sirina = objekt.lat, Geo_duzina = objekt.lon, opis = objekt.opis, ID_instruktor = osoba.ID_osoba, Osoba = osoba }; lokacije.Add(lok); } List <Lokacija> toBeDel = new List <Lokacija>(); foreach (Lokacija lok in osoba.Lokacija) { if (lokacije.Where(l => l.Geo_duzina == lok.Geo_duzina && l.Geo_sirina == lok.Geo_sirina).Count() < 1) { toBeDel.Add(lok); } } foreach (Lokacija t in toBeDel) { osoba.Lokacija.Remove(t); } data.SaveChanges(); foreach (Lokacija nova in lokacije) { Lokacija istaIzBaze; if (osoba.Lokacija.Where(l => l.Geo_duzina == nova.Geo_duzina && l.Geo_sirina == nova.Geo_sirina).Count() >= 1) { istaIzBaze = osoba.Lokacija.Where(l => l.Geo_duzina == nova.Geo_duzina && l.Geo_sirina == nova.Geo_sirina).FirstOrDefault(); } else { istaIzBaze = null; } if (istaIzBaze == null) { nova.Id = data.Lokacija.Max(l => l.Id) + 1; osoba.Lokacija.Add(nova); data.SaveChanges(); } else if (istaIzBaze.opis.Equals(nova.opis) == false) { istaIzBaze.opis = nova.opis; data.SaveChanges(); } } } } } data.SaveChanges(); } model.ostalePostavke = new OstalePostavke(); model.mojeVlastiteInstrukcije = new MojeInstrukcije(); ViewBag.razinaPrava = osoba.razina_prava; var queryPredmeti = from predmet in data.Predmet join osobaPredmet in data.osoba_predmet on predmet.ID_predmet equals osobaPredmet.ID_predmet where osobaPredmet.ID_osoba == osoba.ID_osoba select predmet; ViewBag.predmet = queryPredmeti.ToList <Predmet>(); model.mojeVlastiteInstrukcije.mojiTermini = osoba.Termin.Select(t => t.ID_termin).ToList().ConvertAll <string>(x => x.ToString()); model.mojeVlastiteInstrukcije.dogovoreni_termini_kao_instruktor = new List <dogovor_term_osoba>(); model.mojeVlastiteInstrukcije.dogovoreni_termini_kao_klijent = new List <dogovor_term_osoba>(); model.mojeVlastiteInstrukcije.mojiPredmeti = new List <OpisanPredmet>(); model.mojeVlastiteInstrukcije.sveKategorije = new List <Kategorija>(); model.mojeVlastiteInstrukcije.sveUstanove = new List <Ustanova>(); model.mojeVlastiteInstrukcije.sviPredmeti = new List <Predmet>(); foreach (dogovor_termin dogovor in osoba.dogovor_termin.ToList()) { if (dogovor.dogovor_status != 20 && dogovor.dogovor_status != 0 && dogovor.datum_dogovor.Value > DateTime.Now.AddDays(-10) && dogovor.dogovor_status != 3) { //dogovor.datum_dogovor.Value.AddHours((int)dogovor.Termin.FirstOrDefault().period_termin); //Debug.WriteLine(dogovor.datum_dogovor.Value); model.mojeVlastiteInstrukcije.dogovoreni_termini_kao_instruktor.Add(new dogovor_term_osoba() { termin = dogovor, lokacija = dogovor.Lokacija, ime = data.Osoba.Where(o => o.ID_osoba == dogovor.ID_klijent).FirstOrDefault().ime_osoba, prezime = data.Osoba.Where(o => o.ID_osoba == dogovor.ID_klijent).FirstOrDefault().prezime_osoba, predmet = data.Predmet.Where(k => k.ID_predmet == dogovor.ID_predmet).FirstOrDefault().naziv_predmet, odustani = false, seen = false }); } } foreach (dogovor_termin dogovor in osoba.dogovor_termin1.ToList()) { if (dogovor.dogovor_status != 0 && dogovor.datum_dogovor.Value > DateTime.Now.AddDays(-10) && dogovor.dogovor_status != 2 && dogovor.dogovor_status != 20) { //dogovor.datum_dogovor.Value.AddHours((int)dogovor.Termin.OrderBy(o => o.period_termin).FirstOrDefault().period_termin); //Debug.WriteLine(dogovor.datum_dogovor.Value); model.mojeVlastiteInstrukcije.dogovoreni_termini_kao_klijent.Add(new dogovor_term_osoba() { termin = dogovor, lokacija = dogovor.Lokacija, ime = data.Osoba.Where(o => o.ID_osoba == dogovor.ID_instruktor).FirstOrDefault().ime_osoba, prezime = data.Osoba.Where(o => o.ID_osoba == dogovor.ID_instruktor).FirstOrDefault().prezime_osoba, predmet = data.Predmet.Where(k => k.ID_predmet == dogovor.ID_predmet).FirstOrDefault().naziv_predmet, odustani = false, seen = false }); } } #region populate OpisanPredmet var detaljiPredmetOsoba = from p in data.Predmet join op in data.osoba_predmet on p.ID_predmet equals op.ID_predmet join u in data.Ustanova on p.ID_ustanova equals u.ID_ustanova join k in data.Kategorija on p.ID_kategorija equals k.ID_kategorija where osoba.ID_osoba == op.ID_osoba select new { p.ID_predmet, p.naziv_predmet, p.kratica_predmet, op.cijena, u.ID_ustanova, k.ID_kategorija }; foreach (var row in detaljiPredmetOsoba) { Ustanova ust = data.Ustanova.Find(row.ID_ustanova); Kategorija kat = data.Kategorija.Find(row.ID_kategorija); model.mojeVlastiteInstrukcije.mojiPredmeti.Add(new OpisanPredmet() { IDpredmet = row.ID_predmet, nazivPredmet = row.naziv_predmet, kraticaPredmet = row.kratica_predmet, cijenaPredmet = row.cijena, IDkategorija = row.ID_kategorija, IDustanova = row.ID_ustanova, ustanova = ust, kategorija = kat }); } #endregion #region populate Ustanova Kategorija var ustanovaQuery = from u in data.Ustanova select u; var kategorijaQuery = from k in data.Kategorija select k; model.mojeVlastiteInstrukcije.sveUstanove.AddRange(ustanovaQuery.ToList()); model.mojeVlastiteInstrukcije.sveKategorije.AddRange(kategorijaQuery.ToList()); #endregion #region populate Predmeti var predmetiQuery = from p in data.Predmet select p; model.mojeVlastiteInstrukcije.sviPredmeti.AddRange(predmetiQuery.ToList()); #endregion model.mojeVlastiteInstrukcije.popis_kategorija = new List <odabranaKategorija>(); foreach (Kategorija kateg in data.Kategorija) { odabranaKategorija odabrananadkat = new odabranaKategorija(); odabrananadkat.mojiPredmeti = new List <odabranPredmet>(); foreach (Predmet pred in data.Predmet.Where(k => k.ID_kategorija == kateg.ID_kategorija)) { odabranPredmet item = new odabranPredmet(); item.predmet = pred; if (osoba.osoba_predmet.Where(k => k.ID_predmet == pred.ID_kategorija).Count() == 1) { item.odabran = true; } else { item.odabran = false; } odabrananadkat.mojiPredmeti.Add(item); } odabrananadkat.kategorija_ime = kateg.naziv_kategorija; model.mojeVlastiteInstrukcije.popis_kategorija.Add(odabrananadkat); } model.mojeVlastiteInstrukcije.MojeLokacijeJson = convertLokacije(data.Lokacija.Where(l => l.Osoba.ID_osoba == osoba.ID_osoba).ToList()); if (osoba.razina_prava == 1) { model.ostalePostavke.instruktor = true; } else { model.ostalePostavke.instruktor = false; } return(View(model)); } }