// 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);
            }
        }
Example #2
0
        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);
            }
        }