private void updateKvalStatus(Propozicije propozicije)
        {
            if (!propozicije.odvojenoTak3())
            {
                foreach (RezultatSpravaFinaleKupa r in Rezultati)
                {
                    r.KvalStatus = KvalifikacioniStatus.None;
                }
                return;
            }

            List <RezultatSpravaFinaleKupa> rezultati = new List <RezultatSpravaFinaleKupa>(Rezultati);
            PropertyDescriptor propDesc =
                TypeDescriptor.GetProperties(typeof(RezultatSpravaFinaleKupa))["RedBroj"];

            rezultati.Sort(new SortComparer <RezultatSpravaFinaleKupa>(propDesc,
                                                                       ListSortDirection.Ascending));

            // moram da koristim dve mape zato sto je moguca situacija da klub i
            // drzava imaju isti id
            IDictionary <int, int> brojTakmicaraKlubMap   = new Dictionary <int, int>();
            IDictionary <int, int> brojTakmicaraDrzavaMap = new Dictionary <int, int>();

            int finCount = 0;
            int rezCount = 0;

            for (int i = 0; i < rezultati.Count; i++)
            {
                RezultatSpravaFinaleKupa rezultat = rezultati[i];
                if (rezultat.Total == null)
                {
                    rezultat.KvalStatus = KvalifikacioniStatus.None;
                    continue;
                }

                int id;
                IDictionary <int, int> brojTakmicaraMap;

                if (propozicije.MaxBrojTakmicaraTak3VaziZaDrzavu)
                {
                    if (rezultat.Gimnasticar.DrzavaUcesnik != null)
                    {
                        id = rezultat.Gimnasticar.DrzavaUcesnik.Id;
                        brojTakmicaraMap = brojTakmicaraDrzavaMap;
                    }
                    else
                    {
                        id = rezultat.Gimnasticar.KlubUcesnik.Id;
                        brojTakmicaraMap = brojTakmicaraKlubMap;
                    }
                }
                else
                {
                    if (rezultat.Gimnasticar.KlubUcesnik != null)
                    {
                        id = rezultat.Gimnasticar.KlubUcesnik.Id;
                        brojTakmicaraMap = brojTakmicaraKlubMap;
                    }
                    else
                    {
                        id = rezultat.Gimnasticar.DrzavaUcesnik.Id;
                        brojTakmicaraMap = brojTakmicaraDrzavaMap;
                    }
                }

                if (!brojTakmicaraMap.ContainsKey(id))
                {
                    brojTakmicaraMap.Add(id, 0);
                }

                if (finCount < propozicije.BrojFinalistaTak3)
                {
                    if (propozicije.NeogranicenBrojTakmicaraIzKlubaTak3)
                    {
                        finCount++;
                        rezultat.KvalStatus = KvalifikacioniStatus.Q;
                    }
                    else
                    {
                        if (brojTakmicaraMap[id] < propozicije.MaxBrojTakmicaraIzKlubaTak3)
                        {
                            finCount++;
                            brojTakmicaraMap[id]++;
                            rezultat.KvalStatus = KvalifikacioniStatus.Q;
                        }
                        else
                        {
                            if (Opcije.Instance.UzimajPrvuSlobodnuRezervu &&
                                rezCount < propozicije.BrojRezerviTak3)
                            {
                                rezCount++;
                                rezultat.KvalStatus = KvalifikacioniStatus.R;
                            }
                            else
                            {
                                rezultat.KvalStatus = KvalifikacioniStatus.None;
                            }
                        }
                    }
                }
                else if (rezCount < propozicije.BrojRezerviTak3)
                {
                    if (propozicije.NeogranicenBrojTakmicaraIzKlubaTak3)
                    {
                        rezCount++;
                        rezultat.KvalStatus = KvalifikacioniStatus.R;
                    }
                    else
                    {
                        if (brojTakmicaraMap[id] < propozicije.MaxBrojTakmicaraIzKlubaTak3)
                        {
                            rezCount++;
                            brojTakmicaraMap[id]++;
                            rezultat.KvalStatus = KvalifikacioniStatus.R;
                        }
                        else
                        {
                            if (Opcije.Instance.UzimajPrvuSlobodnuRezervu &&
                                rezCount < propozicije.BrojRezerviTak3)
                            {
                                rezCount++;
                                rezultat.KvalStatus = KvalifikacioniStatus.R;
                            }
                            else
                            {
                                rezultat.KvalStatus = KvalifikacioniStatus.None;
                            }
                        }
                    }
                }
                else
                {
                    rezultat.KvalStatus = KvalifikacioniStatus.None;
                }
            }
        }
Exemple #2
0
        public static void updateKvalStatus <T>(Propozicije propozicije, IList <T> rezultatiList,
                                                DeoTakmicenjaKod deoTakKod, IsTotalNull <T> isTotalNull) where T : RezultatSprava
        {
            foreach (T r in rezultatiList)
            {
                r.KvalStatus = KvalifikacioniStatus.None;
            }

            if (deoTakKod != DeoTakmicenjaKod.Takmicenje1 || !propozicije.odvojenoTak3())
            {
                return;
            }

            List <T>           rezultati = new List <T>(rezultatiList);
            PropertyDescriptor propDesc  = TypeDescriptor.GetProperties(typeof(T))["RedBroj"];

            rezultati.Sort(new SortComparer <T>(propDesc, ListSortDirection.Ascending));

            // moram da koristim dve mape zato sto je moguca situacija da klub i
            // drzava imaju isti id
            IDictionary <int, int> brojTakmicaraKlubMap   = new Dictionary <int, int>();
            IDictionary <int, int> brojTakmicaraDrzavaMap = new Dictionary <int, int>();
            IDictionary <int, int> brojTakmicaraMap       = null;
            int id = -1;

            int         finCount        = 0;
            int         rezCount        = 0;
            T           prevFinRezultat = null;
            List <bool> porediDrzavu    = new List <bool>();

            for (int i = 0; i < rezultati.Count; i++)
            {
                T rezultat = rezultati[i];
                if (isTotalNull(rezultat))
                {
                    rezultat.KvalStatus = KvalifikacioniStatus.None;
                    continue;
                }

                if (!propozicije.NeogranicenBrojTakmicaraIzKlubaTak3)
                {
                    porediDrzavu.Add(false);
                    if (propozicije.MaxBrojTakmicaraTak3VaziZaDrzavu)
                    {
                        if (rezultat.Gimnasticar.DrzavaUcesnik != null)
                        {
                            porediDrzavu[i] = true;
                            id = rezultat.Gimnasticar.DrzavaUcesnik.Id;
                            brojTakmicaraMap = brojTakmicaraDrzavaMap;
                        }
                        else
                        {
                            id = rezultat.Gimnasticar.KlubUcesnik.Id;
                            brojTakmicaraMap = brojTakmicaraKlubMap;
                        }
                    }
                    else
                    {
                        if (rezultat.Gimnasticar.KlubUcesnik != null)
                        {
                            id = rezultat.Gimnasticar.KlubUcesnik.Id;
                            brojTakmicaraMap = brojTakmicaraKlubMap;
                        }
                        else
                        {
                            porediDrzavu[i] = true;
                            id = rezultat.Gimnasticar.DrzavaUcesnik.Id;
                            brojTakmicaraMap = brojTakmicaraDrzavaMap;
                        }
                    }
                    if (!brojTakmicaraMap.ContainsKey(id))
                    {
                        brojTakmicaraMap.Add(id, 0);
                    }
                }

                if (finCount < propozicije.BrojFinalistaTak3 || rezultat.Rank == prevFinRezultat.Rank)
                {
                    if (propozicije.NeogranicenBrojTakmicaraIzKlubaTak3 ||
                        brojTakmicaraMap[id] < propozicije.MaxBrojTakmicaraIzKlubaTak3 ||
                        postojiIstiKvalRezultatIzKluba <T>(rezultat, rezultati, porediDrzavu))
                    {
                        // Poslednji uslov u if naredbi znaci da je dostignut limit broja takmicara iz kluba, a medju
                        // finalistima se nalazi i gimnasticar iz istog kluba koji ima istu ocenu. U tom slucaju moramo
                        // da dodamo i ovog finalistu. TODO4: Da li u ovom slucaju treba da povecavamo finCount? (i kod
                        // rezultata viseboja isto).

                        finCount++;
                        rezultat.KvalStatus = KvalifikacioniStatus.Q;
                        prevFinRezultat     = rezultat;
                        if (!propozicije.NeogranicenBrojTakmicaraIzKlubaTak3)
                        {
                            brojTakmicaraMap[id]++;
                        }
                    }
                    else if (rezCount < propozicije.BrojRezerviTak3 && Opcije.Instance.UzimajPrvuSlobodnuRezervu)
                    {
                        rezCount++;
                        rezultat.KvalStatus = KvalifikacioniStatus.R;
                    }
                    else
                    {
                        rezultat.KvalStatus = KvalifikacioniStatus.None;
                    }
                }
                else if (rezCount < propozicije.BrojRezerviTak3)
                {
                    if (propozicije.NeogranicenBrojTakmicaraIzKlubaTak3 ||
                        brojTakmicaraMap[id] < propozicije.MaxBrojTakmicaraIzKlubaTak3)
                    {
                        rezCount++;
                        rezultat.KvalStatus = KvalifikacioniStatus.R;
                        if (!propozicije.NeogranicenBrojTakmicaraIzKlubaTak3)
                        {
                            brojTakmicaraMap[id]++;
                        }
                    }
                    else if (Opcije.Instance.UzimajPrvuSlobodnuRezervu)
                    {
                        rezCount++;
                        rezultat.KvalStatus = KvalifikacioniStatus.R;
                    }
                    else
                    {
                        rezultat.KvalStatus = KvalifikacioniStatus.None;
                    }
                }
                else
                {
                    // TODO: Uradi i za rezerve razresavanje situacije kada postoji vise rezervi sa identicnim
                    // rezultatom (isto i za rezultate viseboj).
                    rezultat.KvalStatus = KvalifikacioniStatus.None;
                }
            }
        }