// TODO3: Kod finala kupa bi trebalo kod kloniranja ubaciti gimnasticare iz oba kola. public virtual void create(RezultatskoTakmicenje rezTak, PoredakSprava poredakPrvoKolo, PoredakSprava poredakDrugoKolo, List<RezultatSpravaFinaleKupaUpdate> rezultatiUpdate) { IList<GimnasticarUcesnik> gimnasticari = new List<GimnasticarUcesnik>(rezTak.Takmicenje1.Gimnasticari); IDictionary<GimnasticarUcesnik, RezultatSpravaFinaleKupa> rezultatiMap = new Dictionary<GimnasticarUcesnik, RezultatSpravaFinaleKupa>(); foreach (GimnasticarUcesnik g in gimnasticari) { RezultatSpravaFinaleKupa rezultat = new RezultatSpravaFinaleKupa(); rezultat.Gimnasticar = g; rezultatiMap.Add(g, rezultat); } if (poredakPrvoKolo != null) { foreach (RezultatSprava r in poredakPrvoKolo.Rezultati) { if (rezultatiMap.ContainsKey(r.Gimnasticar)) { RezultatSpravaFinaleKupa r2 = rezultatiMap[r.Gimnasticar]; r2.D_PrvoKolo = r.D; r2.E_PrvoKolo = r.E; r2.TotalPrvoKolo = r.Total; } } } if (poredakDrugoKolo != null) { foreach (RezultatSprava r in poredakDrugoKolo.Rezultati) { if (rezultatiMap.ContainsKey(r.Gimnasticar)) { RezultatSpravaFinaleKupa r2 = rezultatiMap[r.Gimnasticar]; r2.D_DrugoKolo = r.D; r2.E_DrugoKolo = r.E; r2.TotalDrugoKolo = r.Total; } } } List<RezultatSpravaFinaleKupa> rezultati = new List<RezultatSpravaFinaleKupa>(rezultatiMap.Values); Rezultati.Clear(); foreach (RezultatSpravaFinaleKupa r in rezultati) Rezultati.Add(r); // Total moze da bude krajnja finalna ocena ili ulazna finalna ocena. U oba slucaja se Total izracunava // na isti nacin. foreach (RezultatSpravaFinaleKupa rez in Rezultati) { if (rez.TotalPrvoKolo == null && rez.TotalDrugoKolo == null) { rez.setTotal(null); continue; } float total1 = rez.TotalPrvoKolo == null ? 0 : rez.TotalPrvoKolo.Value; float total2 = rez.TotalDrugoKolo == null ? 0 : rez.TotalDrugoKolo.Value; float total; if (rezTak.Propozicije.Tak3FinalnaOcenaJeZbirObaKola) total = total1 + total2; else if (rezTak.Propozicije.Tak3FinalnaOcenaJeMaxObaKola) total = total1 > total2 ? total1 : total2; else { // TODO3: Proveri da li ovde treba podesavati broj decimala. total = (total1 + total2) / 2; if (rezTak.Propozicije.Tak3NeRacunajProsekAkoNemaOceneIzObaKola && (rez.TotalPrvoKolo == null || rez.TotalDrugoKolo == null)) { total = total1 + total2; } } rez.setTotal(total); } rankRezultati(); if (rezTak.Propozicije.OdvojenoTak3) { updateKvalStatus(rezTak.Propozicije.BrojFinalistaTak3, rezTak.Propozicije.NeogranicenBrojTakmicaraIzKlubaTak3, rezTak.Propozicije.MaxBrojTakmicaraIzKlubaTak3, rezTak.Propozicije.MaxBrojTakmicaraTak3VaziZaDrzavu, rezTak.Propozicije.BrojRezerviTak3); applyRezultatiUpdate(rezultatiUpdate); } }
private void promeniKvalStatus(KvalifikacioniStatus kvalStatus) { RezultatSpravaFinaleKupa rez = spravaGridUserControl1.DataGridViewUserControl.getSelectedItem <RezultatSpravaFinaleKupa>(); int selCount = spravaGridUserControl1.DataGridViewUserControl.getSelectedItems <RezultatSpravaFinaleKupa>().Count; if (selCount != 1 || rez.KvalStatus == kvalStatus) { return; } string msg = String.Empty; if (kvalStatus != KvalifikacioniStatus.None) { string msgFmt = "Da li zelite da oznacite sa \"{1}\" gimnasticara \"{0}\"?"; msg = String.Format(msgFmt, rez.Gimnasticar, kvalStatus); } else { string msgFmt = "Da li zelite da ponistite oznaku \"{1}\" za gimnasticara \"{0}\"?"; msg = String.Format(msgFmt, rez.Gimnasticar, rez.KvalStatus); } if (!MessageDialogs.queryConfirmation(msg, this.Text)) { return; } ISession session = null; try { using (session = NHibernateHelper.Instance.OpenSession()) using (session.BeginTransaction()) { CurrentSessionContext.Bind(session); rez.KvalStatus = kvalStatus; DAOFactoryFactory.DAOFactory.GetPoredakSpravaFinaleKupaDAO().Update( ActiveTakmicenje.Takmicenje1.getPoredakSpravaFinaleKupa(ActiveSprava)); takmicenje = DAOFactoryFactory.DAOFactory.GetTakmicenjeDAO().FindById(takmicenje.Id); takmicenje.LastModified = DateTime.Now; session.Transaction.Commit(); } } catch (Exception ex) { if (session != null && session.Transaction != null && session.Transaction.IsActive) { session.Transaction.Rollback(); } MessageDialogs.showError(Strings.getFullDatabaseAccessExceptionMessage(ex), this.Text); Close(); return; } finally { CurrentSessionContext.Unbind(NHibernateHelper.Instance.SessionFactory); } spravaGridUserControl1.DataGridViewUserControl.refreshItems(); spravaGridUserControl1.DataGridViewUserControl.setSelectedItem <RezultatSpravaFinaleKupa>(rez); }
// TODO3: Za sve poretke (ukupno, sprava, ekipno, kako za finale kupa, tako i za obicna takmicenja) specifikuj // pravila razresavanja istih ocena. public virtual void create(RezultatskoTakmicenje rezTak, PoredakPreskok poredakPrvoKolo, PoredakPreskok poredakDrugoKolo, bool poredak1NaOsnovuObaPreskoka, bool poredak2NaOsnovuObaPreskoka, List<RezultatSpravaFinaleKupaUpdate> rezultatiUpdate) { IList<GimnasticarUcesnik> gimnasticari = new List<GimnasticarUcesnik>(rezTak.Takmicenje1.Gimnasticari); IDictionary<GimnasticarUcesnik, RezultatSpravaFinaleKupa> rezultatiMap = new Dictionary<GimnasticarUcesnik, RezultatSpravaFinaleKupa>(); foreach (GimnasticarUcesnik g in gimnasticari) { RezultatSpravaFinaleKupa rezultat = new RezultatSpravaFinaleKupa(); rezultat.Gimnasticar = g; rezultatiMap.Add(g, rezultat); } if (poredakPrvoKolo != null) { bool postojiTotalObeOcene = false; foreach (RezultatPreskok r in poredakPrvoKolo.Rezultati) { if (rezultatiMap.ContainsKey(r.Gimnasticar)) { RezultatSpravaFinaleKupa r2 = rezultatiMap[r.Gimnasticar]; if (!poredak1NaOsnovuObaPreskoka) { r2.D_PrvoKolo = r.D; r2.E_PrvoKolo = r.E; r2.TotalPrvoKolo = r.Total; } else { r2.D_PrvoKolo = null; r2.E_PrvoKolo = null; r2.TotalPrvoKolo = r.TotalObeOcene; postojiTotalObeOcene |= (r.TotalObeOcene != null); } } } if (poredak1NaOsnovuObaPreskoka && !postojiTotalObeOcene) { // U propozicijama za prvo kolo je stavljeno da se preskok racuna na osnovu // oba preskoka, ali ni za jednog gimnasticara ne postoji ocena za oba preskoka. // Ova situacija najverovatnije nastaje kada se u prvom kolu kao prvi preskok // unosila konacna ocena za oba preskoka. // U tom slucaju, za ocenu prvog kola treba uzeti prvu ocenu. foreach (RezultatPreskok r in poredakPrvoKolo.Rezultati) { if (rezultatiMap.ContainsKey(r.Gimnasticar)) { RezultatSpravaFinaleKupa r2 = rezultatiMap[r.Gimnasticar]; r2.D_PrvoKolo = r.D; r2.E_PrvoKolo = r.E; r2.TotalPrvoKolo = r.Total; } } } } if (poredakDrugoKolo != null) { bool postojiTotalObeOcene = false; foreach (RezultatPreskok r in poredakDrugoKolo.Rezultati) { if (rezultatiMap.ContainsKey(r.Gimnasticar)) { RezultatSpravaFinaleKupa r2 = rezultatiMap[r.Gimnasticar]; if (!poredak2NaOsnovuObaPreskoka) { r2.D_DrugoKolo = r.D; r2.E_DrugoKolo = r.E; r2.TotalDrugoKolo = r.Total; } else { r2.D_DrugoKolo = null; r2.E_DrugoKolo = null; r2.TotalDrugoKolo = r.TotalObeOcene; postojiTotalObeOcene |= (r.TotalObeOcene != null); } } } if (poredak2NaOsnovuObaPreskoka && !postojiTotalObeOcene) { // Isti komentar kao za prvo kolo. foreach (RezultatPreskok r in poredakDrugoKolo.Rezultati) { if (rezultatiMap.ContainsKey(r.Gimnasticar)) { RezultatSpravaFinaleKupa r2 = rezultatiMap[r.Gimnasticar]; r2.D_DrugoKolo = r.D; r2.E_DrugoKolo = r.E; r2.TotalDrugoKolo = r.Total; } } } } List<RezultatSpravaFinaleKupa> rezultati = new List<RezultatSpravaFinaleKupa>(rezultatiMap.Values); Rezultati.Clear(); foreach (RezultatSpravaFinaleKupa r in rezultati) Rezultati.Add(r); // Total moze da bude krajnja finalna ocena ili ulazna finalna ocena. U oba slucaja se Total izracunava // na isti nacin. foreach (RezultatSpravaFinaleKupa rez in Rezultati) { if (rez.TotalPrvoKolo == null && rez.TotalDrugoKolo == null) { rez.setTotal(null); continue; } float total1 = rez.TotalPrvoKolo == null ? 0 : rez.TotalPrvoKolo.Value; float total2 = rez.TotalDrugoKolo == null ? 0 : rez.TotalDrugoKolo.Value; float total; if (rezTak.Propozicije.Tak3FinalnaOcenaJeZbirObaKola) total = total1 + total2; else if (rezTak.Propozicije.Tak3FinalnaOcenaJeMaxObaKola) total = total1 > total2 ? total1 : total2; else { // TODO3: Proveri da li ovde treba podesavati broj decimala. total = (total1 + total2) / 2; if (rezTak.Propozicije.Tak3NeRacunajProsekAkoNemaOceneIzObaKola && (rez.TotalPrvoKolo == null || rez.TotalDrugoKolo == null)) { total = total1 + total2; } } rez.setTotal(total); } rankRezultati(); if (rezTak.Propozicije.OdvojenoTak3) { updateKvalStatus(rezTak.Propozicije.BrojFinalistaTak3, rezTak.Propozicije.NeogranicenBrojTakmicaraIzKlubaTak3, rezTak.Propozicije.MaxBrojTakmicaraIzKlubaTak3, rezTak.Propozicije.MaxBrojTakmicaraTak3VaziZaDrzavu, rezTak.Propozicije.BrojRezerviTak3); applyRezultatiUpdate(rezultatiUpdate); } }