// GET: EczaneNobet/NobetGrupGorevTipKisit/Create
        public ActionResult Create()
        {
            //var user = _userService.GetByUserName(User.Identity.Name);

            //var nobetUstGruplar = _nobetUstGrupService.GetListByUser(user);
            //var nobetUstGrup = nobetUstGruplar.FirstOrDefault();

            var nobetUstGrup = _nobetUstGrupSessionService.GetSession("nobetUstGrup");

            var nobetGrupGorevTipler = _nobetGrupGorevTipService.GetDetaylar(nobetUstGrup.Id);
            var nobetUstGrupKisitlar = _nobetUstGrupKisitService.GetDetaylar(nobetUstGrup.Id);

            ViewBag.NobetGrupGorevTipId = new SelectList(nobetGrupGorevTipler, "Id", "NobetGrupGorevTipAdi");
            ViewBag.NobetUstGrupKisitId = new SelectList(nobetUstGrupKisitlar, "Id", "KisitAdiUzun");
            return(View());
        }
        public ActionResult Index()
        {
            //var user = _userService.GetByUserName(User.Identity.Name);
            //var nobetUstGruplar = _nobetUstGrupService.GetListByUser(user).Select(s => s.Id);
            //var rolIdler = _userService.GetUserRoles(user).OrderBy(s => s.RoleId).Select(u => u.RoleId).ToArray();
            //var rolId = rolIdler.FirstOrDefault();
            //ViewBag.RolId = rolId;
            var nobetUstGrupDetay        = _nobetUstGrupSessionService.GetSession("nobetUstGrup");
            var nobetUstGrupKisitSession = _nobetUstGrupKisitSessionService.GetSessionList("nobetUstGrupKisitSession", nobetUstGrupDetay.Id);

            var model = _nobetUstGrupKisitService.GetDetaylar(nobetUstGrupDetay.Id)
                        //.OrderByDescending(o => o.PasifMi)
                        //.ThenBy(o => o.NobetUstGrupId)
                        .OrderBy(r => r.KisitAdi);

            return(View(model));
        }
        private KirikhanDataModel EczaneNobetDataModel(EczaneNobetDataModelParametre eczaneNobetDataModelParametre)
        {
            #region parametreler

            var nobetUstGrupId   = eczaneNobetDataModelParametre.NobetUstGrupId;
            var nobetGrupIdListe = eczaneNobetDataModelParametre.NobetGrupId.ToList();
            //var nobetGorevTipId = eczaneNobetDataModelParametre.NobetGorevTipId;
            var nobetUstGrupBaslangicTarihi = eczaneNobetDataModelParametre.NobetUstGrupBaslangicTarihi;
            var baslangicTarihi             = eczaneNobetDataModelParametre.BaslangicTarihi;
            var bitisTarihi          = eczaneNobetDataModelParametre.BitisTarihi;
            var nobetGrupGorevTipler = eczaneNobetDataModelParametre.NobetGrupGorevTipler;
            var nobetGorevTipler     = eczaneNobetDataModelParametre.NobetGrupGorevTipler.Select(s => s.NobetGorevTipId).Distinct().ToList();

            var yazBaslangic = new DateTime(baslangicTarihi.Year, 6, 1);
            var yazBitis     = new DateTime(baslangicTarihi.Year, 9, 15);

            #endregion

            if (baslangicTarihi < nobetUstGrupBaslangicTarihi)
            {
                throw new Exception($"Nöbet başlangıç tarihi <strong>({baslangicTarihi.ToShortDateString()})</strong> üst grup başlama tarihinden <strong>({nobetUstGrupBaslangicTarihi.ToShortDateString()})</strong> küçük olamaz.");
            }

            var debugYapilacakEczaneler = _debugEczaneService.GetDetaylarAktifOlanlar(nobetUstGrupId);

            var nobetGruplar = _nobetGrupService.GetDetaylar(nobetGrupIdListe).OrderBy(s => s.Id).ToList();
            //var nobetGrupGorevTipler = _nobetGrupGorevTipService.GetDetaylar(nobetGrupIdListe); //nobetGorevTipId,
            var eczaneNobetSonuclar = _eczaneNobetSonucService.GetSonuclar(nobetUstGrupId);

            var eczaneNobetMazeretNobettenDusenler = new List <EczaneNobetMazeretSayilari>();

            var mazeret = _nobetUstGrupKisitService.GetKisitPasifMi("mazeret", nobetUstGrupId);

            if (mazeret)
            {
                eczaneNobetMazeretNobettenDusenler = _eczaneNobetMazeretService.GetEczaneNobetMazeretSayilari(baslangicTarihi, bitisTarihi, nobetGrupIdListe);
            }

            var eczaneNobetGruplarTumu = _eczaneNobetGrupService.GetDetaylar(nobetGrupIdListe, baslangicTarihi, bitisTarihi)
                                         .Where(w => !eczaneNobetMazeretNobettenDusenler.Select(s => s.EczaneNobetGrupId).Contains(w.Id)
                                                //&& w.EczaneAdi == "ÖZGÜR"
                                                ).ToList();

            var nobetGorevTipId = 1;
            if (!nobetGorevTipler.Contains(nobetGorevTipId))
            {
                nobetGorevTipId = 0;
            }

            var eczaneNobetGruplarGorevTip1 = eczaneNobetGruplarTumu
                                              .Where(w => w.NobetGorevTipId == nobetGorevTipId).ToList();

            nobetGorevTipId = 13;
            if (!nobetGorevTipler.Contains(nobetGorevTipId))
            {
                nobetGorevTipId = 0;
            }

            var eczaneNobetGruplarGorevTip2 = eczaneNobetGruplarTumu
                                              .Where(w => w.NobetGorevTipId == nobetGorevTipId).ToList();

            var eczaneNobetSonuclarOncekiAylar = eczaneNobetSonuclar
                                                 .Where(w => w.Tarih >= nobetUstGrupBaslangicTarihi &&
                                                        eczaneNobetGruplarTumu.Select(s => s.Id).Contains(w.EczaneNobetGrupId) //görevtip: tümü
                                                                                                                               //&& eczaneNobetGruplarGorevTip1.Select(s => s.Id).Contains(w.EczaneNobetGrupId) //görevtip: 1
                                                        ).ToList();

            var eczaneNobetSonuclarCozulenGruplar = eczaneNobetSonuclar
                                                    .Where(w => eczaneNobetGruplarTumu.Select(s => s.Id).Contains(w.EczaneNobetGrupId)).ToList();

            var son3Ay = baslangicTarihi.AddMonths(-2);

            var eczaneNobetSonuclarSon3Ay = eczaneNobetSonuclarCozulenGruplar
                                            .Where(w => w.Tarih >= son3Ay).ToList();

            var sonuclarKontrol = _eczaneNobetSonucService.GetSonuclar(baslangicTarihi, bitisTarihi, eczaneNobetSonuclarCozulenGruplar);

            if (sonuclarKontrol.Count > 0)
            {
                throw new Exception("Kriterlere uygun <strong>daha önce yazılmış nöbetler</strong> bulunmaktadır. Lütfen kontrol ediniz!");
            }

            var tarihAralik = _takvimService.GetTakvimNobetGruplar(baslangicTarihi, bitisTarihi, nobetGrupGorevTipler);

            var tarihAralikTumu = _takvimService.GetTakvimNobetGruplar(nobetUstGrupBaslangicTarihi, bitisTarihi, nobetGrupGorevTipler);

            var yazDonemiTarihAraligiCts = tarihAralikTumu
                                           .Where(w => (w.Tarih >= yazBaslangic &&
                                                        w.Tarih >= baslangicTarihi &&
                                                        w.Tarih <= yazBitis) &&
                                                  w.NobetGunKuralId == 7 &&
                                                  w.NobetGorevTipId == 13
                                                  ).ToList();

            //var haftaSonlari = tarihAralik.Where(w => w.NobetGunKuralId == 7).ToList();

            var enSonNobetler       = _eczaneNobetOrtakService.GetEczaneNobetGrupGunKuralIstatistik(eczaneNobetGruplarTumu, eczaneNobetSonuclarCozulenGruplar);
            var enSonNobetlerSon3Ay = _eczaneNobetOrtakService.GetEczaneNobetGrupGunKuralIstatistik(eczaneNobetGruplarTumu, eczaneNobetSonuclarSon3Ay);

            var eczaneNobetGrupGunKuralIstatistikYatay = _eczaneNobetOrtakService.GetEczaneNobetGrupGunKuralIstatistikYatay(enSonNobetler);
            var eczaneBazliGunKuralIstatistikYatay     = _eczaneNobetOrtakService.GetEczaneNobetGrupGunKuralIstatistikYatay(enSonNobetler);

            var eczaneNobetGrupGunKuralIstatistikYataySon3Ay = _eczaneNobetOrtakService.GetEczaneNobetGrupGunKuralIstatistikYatay(enSonNobetlerSon3Ay);

            //var bak = eczaneNobetGrupGunKuralIstatistikYatay.Where(w => w.NobetGorevTipId == 2).ToList();

            var nobetBorcOdeme = _nobetUstGrupKisitService.GetDetay(39, nobetUstGrupId);

            if (nobetBorcOdeme.Id == 39)
            {
                var anahtarListe = eczaneNobetSonuclar
                                   .Where(w => w.Tarih < nobetUstGrupBaslangicTarihi && nobetGrupIdListe.Contains(w.NobetGrupId)).ToList();

                var borcTakipEdilecekGunGruplar = new int[]
                {
                    //1,
                    //3,
                    4
                };

                var gunGruplar = tarihAralik
                                 .Where(w => borcTakipEdilecekGunGruplar.Contains(w.GunGrupId))
                                 .Select(s => new { s.GunGrupId, s.GunGrupAdi })
                                 .Distinct()
                                 .OrderBy(o => o.GunGrupId).ToList();

                foreach (var gunGrup in gunGruplar)
                {
                    var haftaIciAnahtarListeTumEczaneler = _takvimService.AnahtarListeyiBuGuneTasi(nobetGrupGorevTipler, eczaneNobetGruplarTumu, eczaneNobetGrupGunKuralIstatistikYatay, anahtarListe, gunGrup.GunGrupAdi);

                    var nobetBorcEczaneler = (from s in eczaneNobetGrupGunKuralIstatistikYatay
                                              from b in haftaIciAnahtarListeTumEczaneler
                                              where s.EczaneNobetGrupId == b.EczaneNobetGrupId &&
                                              s.NobetSayisiHaftaIci == b.NobetSayisi
                                              select new EczaneNobetAlacakVerecek
                    {
                        EczaneNobetGrupId = s.EczaneNobetGrupId,
                        EczaneId = s.EczaneId,
                        EczaneAdi = s.EczaneAdi,
                        NobetGrupAdi = s.NobetGrupAdi,
                        NobetGrupId = s.NobetGrupId,
                        NobetSayisi = gunGrup.GunGrupId == 1
                                                      ? s.NobetSayisiPazar
                                                      : gunGrup.GunGrupId == 4
                                                      ? s.NobetSayisiCumartesi
                                                      : s.NobetSayisiHaftaIci,
                        SonNobetTarihi = gunGrup.GunGrupId == 1
                                                      ? s.SonNobetTarihiPazar
                                                      : gunGrup.GunGrupId == 4
                                                      ? s.SonNobetTarihiCumartesi
                                                      : s.SonNobetTarihiHaftaIci,
                        AnahtarTarih = b.Tarih,
                        BorcluGunSayisi = gunGrup.GunGrupId == 1
                                                      ? ((int)(s.NobetSayisiPazar > 0
                                                          ? (s.SonNobetTarihiPazar - b.Tarih).TotalDays
                                                          : (s.SonNobetTarihiPazar - b.Tarih).TotalDays - (s.SonNobetTarihiPazar - b.NobetUstGrupBaslamaTarihi).TotalDays))
                                                      : gunGrup.GunGrupId == 4
                                                      ? ((int)(s.NobetSayisiCumartesi > 0
                                                          ? (s.SonNobetTarihiCumartesi - b.Tarih).TotalDays
                                                          : (s.SonNobetTarihiCumartesi - b.Tarih).TotalDays - (s.SonNobetTarihiCumartesi - b.NobetUstGrupBaslamaTarihi).TotalDays))
                                                      : ((int)(s.NobetSayisiHaftaIci > 0
                                                          ? (s.SonNobetTarihiHaftaIci - b.Tarih).TotalDays
                                                          : (s.SonNobetTarihiHaftaIci - b.Tarih).TotalDays - (s.SonNobetTarihiHaftaIci - b.NobetUstGrupBaslamaTarihi).TotalDays)),
                        GunGrupAdi = gunGrup.GunGrupAdi,
                        GunGrupId = gunGrup.GunGrupId
                    }).ToList();

                    foreach (var eczane in nobetBorcEczaneler)
                    {
                        if (gunGrup.GunGrupId == 1)
                        {
                            //eczaneNobetGrupGunKuralIstatistikYatay
                            //.Where(w => w.EczaneNobetGrupId == eczane.EczaneNobetGrupId)
                            //.FirstOrDefault().bo = (int)eczane.BorcluGunSayisi;
                        }
                        else if (gunGrup.GunGrupId == 3)
                        {
                            eczaneNobetGrupGunKuralIstatistikYatay
                            .Where(w => w.EczaneNobetGrupId == eczane.EczaneNobetGrupId)
                            .FirstOrDefault().BorcluNobetSayisiHaftaIci = (int)eczane.BorcluGunSayisi;
                        }
                        else if (gunGrup.GunGrupId == 4)
                        {
                        }
                    }
                }
            }

            var grupluEczaneNobetSonuclar = _eczaneNobetSonucService.GetSonuclar(baslangicTarihi, bitisTarihi, eczaneNobetSonuclar);

            var eczaneGrupEdges = _eczaneGrupService.GetEdges(nobetUstGrupId)
                                  .Where(e => (nobetGrupIdListe.Contains(e.FromNobetGrupId) ||
                                               nobetGrupIdListe.Contains(e.ToNobetGrupId)))
                                  .Where(w => (grupluEczaneNobetSonuclar.Select(s => s.EczaneId).Distinct().Contains(w.From) ||
                                               grupluEczaneNobetSonuclar.Select(s => s.EczaneId).Distinct().Contains(w.To))
                                         ).ToList();

            //sonuçlarda ilişkili eczaneler
            var eczaneGruplar = _eczaneGrupService.GetDetaylarAktifGruplar(nobetUstGrupId)
                                .Where(x => (eczaneGrupEdges.Select(s => s.From).Distinct().Contains(x.EczaneId) || eczaneGrupEdges.Select(s => s.To).Distinct().Contains(x.EczaneId)) ||
                                       nobetGrupIdListe.Contains(x.NobetGrupId)
                                       ).ToList();

            //fazladan gelen tanımlar var iyileştirmekte fayda var
            var eczaneGrupTanimlar = _eczaneGrupTanimService.GetDetaylarAktifTanimList(eczaneGruplar.Select(x => x.EczaneGrupTanimId).ToList());

            var eczaneGruplar2 = _eczaneGrupService.GetDetaylarByEczaneGrupTanimId(eczaneGrupTanimlar.Select(s => s.Id).ToList());

            var eczaneGrupNobetSonuclar = grupluEczaneNobetSonuclar
                                          .Where(w => eczaneGruplar2.Select(s => s.EczaneId).Contains(w.EczaneId)).ToList();

            //nöbet yazılacak tarih aralığı(örn. Ocak ayının tüm günleri)

            var eczaneKumulatifHedefler  = new List <EczaneNobetIstatistik>();
            var eczaneNobetIstatistikler = new List <EczaneNobetIstatistik>();

            //2.görev tipi için sadece cumartesi olduğu için tüm günler tüm görev tiplerini almaya gerek yok.
            //var eczaneNobetTarihAralik = _takvimService.GetEczaneNobetTarihAralik(baslangicTarihi, bitisTarihi, nobetGrupGorevTipler)
            //    .Where(w => eczaneNobetGruplar.Select(s => s.EczaneId).Contains(w.EczaneId)).ToList();
            var nobetGrupGorevTipGunKurallar = _nobetGrupGorevTipGunKuralService.GetDetaylarAktifList(nobetGrupGorevTipler.Select(s => s.Id).ToList());

            nobetGorevTipId = 1;

            var nobetGrupGorevTip1 = nobetGrupGorevTipler.Where(w => w.NobetGorevTipId == nobetGorevTipId).ToList();

            var eczaneNobetTarihAralik1 = _takvimService.GetEczaneNobetTarihAralik(baslangicTarihi, bitisTarihi, nobetGrupGorevTip1)
                                          .Where(w => eczaneNobetGruplarGorevTip1.Select(s => s.Id).Contains(w.EczaneNobetGrupId)).ToList();

            nobetGorevTipId = 13;

            var nobetGrupGorevTip2 = nobetGrupGorevTipler.Where(w => w.NobetGorevTipId == nobetGorevTipId).ToList();

            var noberGunKurallar = nobetGrupGorevTipGunKurallar
                                   .Where(w => nobetGrupGorevTip2.Select(s => s.Id).Contains(w.NobetGrupGorevTipId))
                                   .Select(s => s.NobetGunKuralId).ToList();

            var eczaneNobetTarihAralik2 = _takvimService.GetEczaneNobetTarihAralik(baslangicTarihi, bitisTarihi, nobetGrupGorevTip2, noberGunKurallar)
                                          .Where(w => eczaneNobetGruplarGorevTip2.Select(s => s.Id).Contains(w.EczaneNobetGrupId)).ToList();

            if (YazDonemiMi(baslangicTarihi, yazBaslangic, yazBitis))
            {
                eczaneNobetTarihAralik1 = eczaneNobetTarihAralik1.Where(w => !yazDonemiTarihAraligiCts.Select(s => s.TakvimId).Contains(w.TakvimId)).ToList();
                //eczaneNobetTarihAralik2 = eczaneNobetTarihAralik1.Where(w => haftaSonlari.Select(s => s.TakvimId).Contains(w.TakvimId)).ToList();
            }
            else
            {
                eczaneNobetTarihAralik2 = new List <EczaneNobetTarihAralik>();
            }

            var eczaneNobetTarihAralik3 = new List <EczaneNobetTarihAralik>();

            foreach (var nobetGrupGorevTip in nobetGrupGorevTip2)
            {
                eczaneNobetTarihAralik3 = eczaneNobetTarihAralik2.Where(w => w.NobetGrupGorevTipId == nobetGrupGorevTip.Id &&
                                                                        w.Tarih >= nobetGrupGorevTip.BaslamaTarihi && (w.Tarih <= nobetGrupGorevTip.BitisTarihi || nobetGrupGorevTip.BitisTarihi == null) &&
                                                                        yazDonemiTarihAraligiCts.Select(s => s.TakvimId).Contains(w.TakvimId)
                                                                        ).ToList();
            }

            var eczaneNobetTarihAralikTumu = eczaneNobetTarihAralik1.Union(eczaneNobetTarihAralik3).ToList();

            //var kd = eczaneNobetTarihAralikTumu.Where(w => w.EczaneAdi == "AHSEN").ToList();

            var eczaneNobetTarihAralik = _eczaneNobetOrtakService.AmacFonksiyonuKatsayisiBelirle(eczaneNobetTarihAralikTumu, eczaneNobetGrupGunKuralIstatistikYatay);

            //var ikiliEczaneler = _ayniGunTutulanNobetService.GetDetaylar(nobetGrupIdListe);

            var eczaneNobetIstekler = _eczaneNobetIstekService.GetDetaylarByNobetGrupIdList(baslangicTarihi, bitisTarihi, nobetGrupIdListe)
                                      .Where(w => eczaneNobetGruplarTumu.Select(s => s.EczaneId).Contains(w.EczaneId)).ToList();

            var eczaneNobetMazeretler = _eczaneNobetMazeretService.GetDetaylarByEczaneIdList(baslangicTarihi, bitisTarihi, eczaneNobetGruplarTumu.Select(s => s.EczaneId).Distinct().ToList())
                                        .Where(w => w.MazeretId != 3)
                                        .ToList();

            var takvimNobetGrupGunDegerIstatistikler = new List <TakvimNobetGrupGunDegerIstatistik>();
            var takvimTumu = new List <TakvimNobetGrup>();

            var cumartesiNobetGunKuralId = new List <int> {
                7
            };

            foreach (var nobetGrupGorevTip in nobetGrupGorevTipler)
            {
                var takvimNobetGrupGunDegerIstatistiklerGorevTip = new List <TakvimNobetGrupGunDegerIstatistik>();
                var takvimAra = new List <TakvimNobetGrup>();

                if (nobetGrupGorevTip.NobetGorevTipId == 13)
                {
                    var tarihlerYaz = tarihAralikTumu
                                      .Where(w => w.NobetGorevTipId == nobetGrupGorevTip.NobetGorevTipId &&
                                             (w.Tarih >= yazBaslangic && w.Tarih <= yazBitis && w.NobetGunKuralId == 7)
                                             )
                                      .Select(s => s.TakvimId).ToArray();

                    takvimNobetGrupGunDegerIstatistiklerGorevTip = _takvimService.GetTakvimNobetGrupGunDegerIstatistikler(
                        nobetUstGrupBaslangicTarihi,
                        bitisTarihi,
                        nobetGrupGorevTip.Id,
                        tarihlerYaz).ToList();

                    takvimAra = tarihAralik
                                .Where(w => w.NobetGorevTipId == nobetGrupGorevTip.NobetGorevTipId &&
                                       (w.Tarih >= yazBaslangic && w.Tarih <= yazBitis && w.NobetGunKuralId == 7)
                                       ).ToList();
                }
                else
                {
                    var tarihlerYaz = tarihAralikTumu
                                      .Where(w => w.NobetGorevTipId == nobetGrupGorevTip.NobetGorevTipId &&
                                             !(w.Tarih >= yazBaslangic && w.Tarih <= yazBitis && w.NobetGunKuralId == 7)
                                             )
                                      .Select(s => s.TakvimId).ToArray();

                    takvimNobetGrupGunDegerIstatistiklerGorevTip = _takvimService.GetTakvimNobetGrupGunDegerIstatistikler(
                        nobetUstGrupBaslangicTarihi,
                        bitisTarihi,
                        nobetGrupGorevTip.Id,
                        tarihlerYaz).ToList();

                    takvimAra = tarihAralik
                                .Where(w => w.NobetGorevTipId == nobetGrupGorevTip.NobetGorevTipId &&
                                       !(w.Tarih >= yazBaslangic && w.Tarih <= yazBitis && w.NobetGunKuralId == 7)
                                       ).ToList();
                }

                takvimTumu.AddRange(takvimAra);
                takvimNobetGrupGunDegerIstatistikler.AddRange(takvimNobetGrupGunDegerIstatistiklerGorevTip);
            }

            //var eczaneNobetGrupAltGruplar = _eczaneNobetGrupAltGrupService.GetDetaylar(nobetUstGrupId);

            var nobetGrupKurallar = _nobetGrupKuralService.GetDetaylar(nobetGrupIdListe);

            var nobetUstGrupKisitlar = _nobetUstGrupKisitService.GetDetaylar(nobetUstGrupId);
            var grupBazliKisitlar    = _nobetGrupGorevTipKisitService.GetDetaylar(nobetUstGrupId);

            var dataModel = new KirikhanDataModel()
            {
                Yil                                          = eczaneNobetDataModelParametre.YilBaslangic,
                Ay                                           = eczaneNobetDataModelParametre.AyBitis,
                TimeLimit                                    = eczaneNobetDataModelParametre.TimeLimit,
                CalismaSayisiLimit                           = eczaneNobetDataModelParametre.CalismaSayisi,
                LowerBound                                   = 0,
                UpperBound                                   = 1,
                BaslangicTarihi                              = baslangicTarihi,
                BitisTarihi                                  = bitisTarihi,
                NobetUstGrupBaslangicTarihi                  = nobetUstGrupBaslangicTarihi,
                NobetUstGrupId                               = nobetUstGrupId,
                EczaneNobetTarihAralik                       = eczaneNobetTarihAralik,  //karar değişkeni
                EczaneKumulatifHedefler                      = eczaneKumulatifHedefler, //.Where(w => w.EczaneId != 121).ToList(),
                EczaneNobetIstatistikler                     = eczaneNobetIstatistikler,
                EczaneNobetMazeretler                        = eczaneNobetMazeretler,
                EczaneGrupTanimlar                           = eczaneGrupTanimlar,
                TarihAraligi                                 = takvimTumu,//tarihAralik,
                NobetGruplar                                 = nobetGruplar,
                EczaneGruplar                                = eczaneGruplar2,
                EczaneNobetIstekler                          = eczaneNobetIstekler,
                NobetGrupGunKurallar                         = _nobetGrupGunKuralService.GetAktifList(nobetGrupIdListe),
                NobetGrupGorevTipGunKurallar                 = _nobetGrupGorevTipGunKuralService.GetDetaylarAktifList(nobetGrupGorevTipler.Select(s => s.Id).ToList()),
                NobetGrupKurallar                            = nobetGrupKurallar,
                NobetGrupGorevTipler                         = nobetGrupGorevTipler,
                NobetGrupTalepler                            = _nobetGrupTalepService.GetDetaylar(nobetGrupIdListe, baslangicTarihi, bitisTarihi),
                EczaneNobetGruplar                           = eczaneNobetGruplarTumu,
                Kisitlar                                     = nobetUstGrupKisitlar,
                EczaneGrupNobetSonuclar                      = eczaneGrupNobetSonuclar,
                EczaneNobetSonuclar                          = eczaneNobetSonuclarCozulenGruplar,
                EczaneGrupNobetSonuclarTumu                  = eczaneNobetSonuclar,
                EczaneNobetGrupGunKuralIstatistikler         = enSonNobetler,
                TakvimNobetGrupGunDegerIstatistikler         = takvimNobetGrupGunDegerIstatistikler,
                EczaneNobetGrupGunKuralIstatistikYatay       = eczaneNobetGrupGunKuralIstatistikYatay,
                EczaneBazliGunKuralIstatistikYatay           = eczaneBazliGunKuralIstatistikYatay,
                EczaneNobetGrupGunKuralIstatistikYataySon3Ay = eczaneNobetGrupGunKuralIstatistikYataySon3Ay,
                NobetGrupGorevTipKisitlar                    = grupBazliKisitlar,
                DebugYapilacakEczaneler                      = debugYapilacakEczaneler
            };

            //_eczaneNobetOrtakService.KurallariKontrolEtHaftaIciEnAzEnCok(nobetUstGrupId, eczaneNobetGrupGunKuralIstatistikYatay);
            _eczaneNobetOrtakService.KurallariKontrolEtMazeretIstek(nobetUstGrupId, eczaneNobetMazeretler, eczaneNobetIstekler);
            _eczaneNobetOrtakService.KurallariKontrolEtIstek(nobetUstGrupId, eczaneNobetIstekler, nobetGrupKurallar);

            return(dataModel);
        }
        private GiresunDataModel EczaneNobetDataModel(EczaneNobetDataModelParametre eczaneNobetDataModelParametre)
        {
            #region parametreler
            var nobetUstGrupId   = eczaneNobetDataModelParametre.NobetUstGrupId;
            var nobetGrupIdListe = eczaneNobetDataModelParametre.NobetGrupId.ToList();
            //var nobetGorevTipId = eczaneNobetDataModelParametre.NobetGorevTipId;
            var nobetUstGrupBaslangicTarihi = eczaneNobetDataModelParametre.NobetUstGrupBaslangicTarihi;
            var baslangicTarihi             = eczaneNobetDataModelParametre.BaslangicTarihi;
            var bitisTarihi          = eczaneNobetDataModelParametre.BitisTarihi;
            var nobetGrupGorevTipler = eczaneNobetDataModelParametre.NobetGrupGorevTipler;
            var nobetGorevTipler     = eczaneNobetDataModelParametre.NobetGrupGorevTipler.Select(s => s.NobetGorevTipId).Distinct().ToList();
            #endregion

            if (baslangicTarihi < nobetUstGrupBaslangicTarihi)
            {
                throw new Exception($"Nöbet başlangıç tarihi <strong>({baslangicTarihi.ToShortDateString()})</strong> üst grup başlama tarihinden <strong>({nobetUstGrupBaslangicTarihi.ToShortDateString()})</strong> küçük olamaz.");
            }

            var debugYapilacakEczaneler = _debugEczaneService.GetDetaylarAktifOlanlar(nobetUstGrupId);

            var nobetGruplar = _nobetGrupService.GetDetaylar(nobetGrupIdListe).OrderBy(s => s.Id).ToList();
            //var nobetGrupGorevTipler = _nobetGrupGorevTipService.GetDetaylar(nobetGrupIdListe); //nobetGorevTipId,
            var eczaneNobetSonuclar = _eczaneNobetSonucService.GetSonuclar(nobetUstGrupId);

            var eczaneNobetMazeretNobettenDusenler = new List <EczaneNobetMazeretSayilari>();

            var mazeret = _nobetUstGrupKisitService.GetKisitPasifMi("mazeret", nobetUstGrupId);

            if (mazeret)
            {
                eczaneNobetMazeretNobettenDusenler = _eczaneNobetMazeretService.GetEczaneNobetMazeretSayilari(baslangicTarihi, bitisTarihi, nobetGrupIdListe);
            }

            var eczaneNobetGruplarTumu = _eczaneNobetGrupService.GetDetaylar(nobetGrupIdListe, baslangicTarihi, bitisTarihi)
                                         .Where(w => !eczaneNobetMazeretNobettenDusenler.Select(s => s.EczaneNobetGrupId).Contains(w.Id)
                                                //&& w.EczaneAdi == "ÖZGÜR"
                                                ).ToList();

            var nobetGorevTipId = 1;
            if (!nobetGorevTipler.Contains(nobetGorevTipId))
            {
                nobetGorevTipId = 0;
            }

            var eczaneNobetGruplarGorevTip1 = eczaneNobetGruplarTumu
                                              .Where(w => w.NobetGorevTipId == nobetGorevTipId).ToList();

            nobetGorevTipId = 2;
            if (!nobetGorevTipler.Contains(nobetGorevTipId))
            {
                nobetGorevTipId = 0;
            }

            var eczaneNobetGruplarGorevTip2 = eczaneNobetGruplarTumu
                                              .Where(w => w.NobetGorevTipId == nobetGorevTipId).ToList();

            var eczaneNobetSonuclarOncekiAylar = eczaneNobetSonuclar
                                                 .Where(w => w.Tarih >= nobetUstGrupBaslangicTarihi &&
                                                        eczaneNobetGruplarTumu.Select(s => s.Id).Contains(w.EczaneNobetGrupId) //görevtip: tümü
                                                                                                                               //&& eczaneNobetGruplarGorevTip1.Select(s => s.Id).Contains(w.EczaneNobetGrupId) //görevtip: 1
                                                        ).ToList();

            var eczaneNobetSonuclarCozulenGruplar = eczaneNobetSonuclar
                                                    .Where(w => eczaneNobetGruplarTumu.Select(s => s.Id).Contains(w.EczaneNobetGrupId)).ToList();

            var son3Ay = new DateTime(2020, 1, 1);
            //baslangicTarihi.AddMonths(-2);

            var eczaneNobetSonuclarSon3Ay = eczaneNobetSonuclarCozulenGruplar
                                            .Where(w => w.Tarih >= son3Ay).ToList();

            var sonuclarKontrol = _eczaneNobetSonucService.GetSonuclar(baslangicTarihi, bitisTarihi, eczaneNobetSonuclarCozulenGruplar);

            if (sonuclarKontrol.Count > 0)
            {
                throw new Exception("Kriterlere uygun <strong>daha önce yazılmış nöbetler</strong> bulunmaktadır. Lütfen kontrol ediniz!");
            }

            var tarihAralik         = _takvimService.GetTakvimNobetGruplar(baslangicTarihi, bitisTarihi, nobetGrupGorevTipler);
            var enSonNobetler       = _eczaneNobetOrtakService.GetEczaneNobetGrupGunKuralIstatistik(eczaneNobetGruplarTumu, eczaneNobetSonuclarCozulenGruplar);
            var enSonNobetlerSon3Ay = _eczaneNobetOrtakService.GetEczaneNobetGrupGunKuralIstatistik(eczaneNobetGruplarTumu, eczaneNobetSonuclarSon3Ay);

            var eczaneNobetGrupGunKuralIstatistikYatay       = _eczaneNobetOrtakService.GetEczaneNobetGrupGunKuralIstatistikYatay(enSonNobetler);
            var eczaneBazliGunKuralIstatistikYatay           = _eczaneNobetOrtakService.GetEczaneBazliGunKuralIstatistikYatay(enSonNobetler);
            var eczaneNobetGrupGunKuralIstatistikYataySon3Ay = _eczaneNobetOrtakService.GetEczaneNobetGrupGunKuralIstatistikYatay(enSonNobetlerSon3Ay);

            //var bak = eczaneNobetGrupGunKuralIstatistikYatay.Where(w => w.NobetGorevTipId == 2).ToList();

            var anahtarListe = eczaneNobetSonuclar
                               .Where(w => w.Tarih < nobetUstGrupBaslangicTarihi && nobetGrupIdListe.Contains(w.NobetGrupId)).ToList();

            var borcTakipEdilecekGunGruplar = new int[]
            {
                //1,
                //3,
                4
            };

            var gunGruplar = tarihAralik
                             .Where(w => borcTakipEdilecekGunGruplar.Contains(w.GunGrupId))
                             .Select(s => new { s.GunGrupId, s.GunGrupAdi })
                             .Distinct()
                             .OrderBy(o => o.GunGrupId).ToList();

            foreach (var gunGrup in gunGruplar)
            {
                var haftaIciAnahtarListeTumEczaneler = _takvimService.AnahtarListeyiBuGuneTasi(nobetGrupGorevTipler, eczaneNobetGruplarTumu, eczaneNobetGrupGunKuralIstatistikYatay, anahtarListe, gunGrup.GunGrupAdi);

                var nobetBorcEczaneler = (from s in eczaneNobetGrupGunKuralIstatistikYatay
                                          from b in haftaIciAnahtarListeTumEczaneler
                                          where s.EczaneNobetGrupId == b.EczaneNobetGrupId &&
                                          s.NobetSayisiHaftaIci == b.NobetSayisi
                                          select new EczaneNobetAlacakVerecek
                {
                    EczaneNobetGrupId = s.EczaneNobetGrupId,
                    EczaneId = s.EczaneId,
                    EczaneAdi = s.EczaneAdi,
                    NobetGrupAdi = s.NobetGrupAdi,
                    NobetGrupId = s.NobetGrupId,
                    NobetSayisi = gunGrup.GunGrupId == 1
                                                  ? s.NobetSayisiPazar
                                                  : gunGrup.GunGrupId == 4
                                                  ? s.NobetSayisiCumartesi
                                                  : s.NobetSayisiHaftaIci,
                    SonNobetTarihi = gunGrup.GunGrupId == 1
                                                  ? s.SonNobetTarihiPazar
                                                  : gunGrup.GunGrupId == 4
                                                  ? s.SonNobetTarihiCumartesi
                                                  : s.SonNobetTarihiHaftaIci,
                    AnahtarTarih = b.Tarih,
                    BorcluGunSayisi = gunGrup.GunGrupId == 1
                                                  ? ((int)(s.NobetSayisiPazar > 0
                                                      ? (s.SonNobetTarihiPazar - b.Tarih).TotalDays
                                                      : (s.SonNobetTarihiPazar - b.Tarih).TotalDays - (s.SonNobetTarihiPazar - b.NobetUstGrupBaslamaTarihi).TotalDays))
                                                  : gunGrup.GunGrupId == 4
                                                  ? ((int)(s.NobetSayisiCumartesi > 0
                                                      ? (s.SonNobetTarihiCumartesi - b.Tarih).TotalDays
                                                      : (s.SonNobetTarihiCumartesi - b.Tarih).TotalDays - (s.SonNobetTarihiCumartesi - b.NobetUstGrupBaslamaTarihi).TotalDays))
                                                  : ((int)(s.NobetSayisiHaftaIci > 0
                                                      ? (s.SonNobetTarihiHaftaIci - b.Tarih).TotalDays
                                                      : (s.SonNobetTarihiHaftaIci - b.Tarih).TotalDays - (s.SonNobetTarihiHaftaIci - b.NobetUstGrupBaslamaTarihi).TotalDays)),
                    GunGrupAdi = gunGrup.GunGrupAdi,
                    GunGrupId = gunGrup.GunGrupId
                }).ToList();

                foreach (var eczane in nobetBorcEczaneler)
                {
                    if (gunGrup.GunGrupId == 1)
                    {
                        //eczaneNobetGrupGunKuralIstatistikYatay
                        //.Where(w => w.EczaneNobetGrupId == eczane.EczaneNobetGrupId)
                        //.FirstOrDefault().bo = (int)eczane.BorcluGunSayisi;
                    }
                    else if (gunGrup.GunGrupId == 3)
                    {
                        eczaneNobetGrupGunKuralIstatistikYatay
                        .Where(w => w.EczaneNobetGrupId == eczane.EczaneNobetGrupId)
                        .FirstOrDefault().BorcluNobetSayisiHaftaIci = (int)eczane.BorcluGunSayisi;
                    }
                    else if (gunGrup.GunGrupId == 4)
                    {
                    }
                }
            }

            var grupluEczaneNobetSonuclar = _eczaneNobetSonucService.GetSonuclar(baslangicTarihi, bitisTarihi, eczaneNobetSonuclar);

            var eczaneGrupEdges = _eczaneGrupService.GetEdges(nobetUstGrupId)
                                  .Where(e => (nobetGrupIdListe.Contains(e.FromNobetGrupId) ||
                                               nobetGrupIdListe.Contains(e.ToNobetGrupId)))
                                  .Where(w => (grupluEczaneNobetSonuclar.Select(s => s.EczaneId).Distinct().Contains(w.From) ||
                                               grupluEczaneNobetSonuclar.Select(s => s.EczaneId).Distinct().Contains(w.To))
                                         ).ToList();

            //sonuçlarda ilişkili eczaneler
            var eczaneGruplar = _eczaneGrupService.GetDetaylarAktifGruplar(nobetUstGrupId)
                                .Where(x => (eczaneGrupEdges.Select(s => s.From).Distinct().Contains(x.EczaneId) || eczaneGrupEdges.Select(s => s.To).Distinct().Contains(x.EczaneId)) ||
                                       nobetGrupIdListe.Contains(x.NobetGrupId)
                                       ).ToList();

            //fazladan gelen tanımlar var iyileştirmekte fayda var
            var eczaneGrupTanimlar = _eczaneGrupTanimService.GetDetaylarAktifTanimList(eczaneGruplar.Select(x => x.EczaneGrupTanimId).ToList());
            var eczaneGruplar2     = _eczaneGrupService.GetDetaylarByEczaneGrupTanimId(eczaneGrupTanimlar.Select(s => s.Id).ToList());

            var eczaneGrupNobetSonuclar = grupluEczaneNobetSonuclar
                                          .Where(w => eczaneGruplar2.Select(s => s.EczaneId).Contains(w.EczaneId)).ToList();

            //nöbet yazılacak tarih aralığı(örn. Ocak ayının tüm günleri)

            var eczaneKumulatifHedefler  = new List <EczaneNobetIstatistik>();
            var eczaneNobetIstatistikler = new List <EczaneNobetIstatistik>();

            //2.görev tipi için sadece cumartesi olduğu için tüm günler tüm görev tiplerini almaya gerek yok.
            //var eczaneNobetTarihAralik = _takvimService.GetEczaneNobetTarihAralik(baslangicTarihi, bitisTarihi, nobetGrupGorevTipler)
            //    .Where(w => eczaneNobetGruplar.Select(s => s.EczaneId).Contains(w.EczaneId)).ToList();
            var nobetGrupGorevTipGunKurallar = _nobetGrupGorevTipGunKuralService.GetDetaylarAktifList(nobetGrupGorevTipler.Select(s => s.Id).ToList());

            nobetGorevTipId = 1;
            var nobetGrupGorevTip1 = nobetGrupGorevTipler.Where(w => w.NobetGorevTipId == nobetGorevTipId).ToList();

            var eczaneNobetTarihAralik1 = _takvimService.GetEczaneNobetTarihAralik(baslangicTarihi, bitisTarihi, nobetGrupGorevTip1)
                                          .Where(w => eczaneNobetGruplarGorevTip1.Select(s => s.Id).Contains(w.EczaneNobetGrupId)).ToList();

            nobetGorevTipId = 2;
            var nobetGrupGorevTip2 = nobetGrupGorevTipler.Where(w => w.NobetGorevTipId == nobetGorevTipId).ToList();
            var noberGunKurallar   = nobetGrupGorevTipGunKurallar.Where(w => nobetGrupGorevTip2.Select(s => s.Id).Contains(w.NobetGrupGorevTipId)).Select(s => s.NobetGunKuralId).ToList();

            var eczaneNobetTarihAralik2 = _takvimService.GetEczaneNobetTarihAralik(baslangicTarihi, bitisTarihi, nobetGrupGorevTip2, noberGunKurallar)
                                          .Where(w => eczaneNobetGruplarGorevTip2.Select(s => s.Id).Contains(w.EczaneNobetGrupId)).ToList();

            var eczaneNobetTarihAralikTumu = eczaneNobetTarihAralik1.Union(eczaneNobetTarihAralik2).ToList();

            //var kd = eczaneNobetTarihAralikTumu.Where(w => w.EczaneAdi == "AHSEN").ToList();

            var eczaneNobetTarihAralik = _eczaneNobetOrtakService.AmacFonksiyonuKatsayisiBelirle(eczaneNobetTarihAralikTumu, eczaneNobetGrupGunKuralIstatistikYatay);

            var ikiliEczaneler = _ayniGunTutulanNobetService.GetDetaylar(nobetGrupIdListe);
            //.Where(w => w.EczaneId1 != w.EczaneId2).ToList();
            //.Select(s => new
            //{
            //    s.EczaneAdi1,
            //    s.EczaneAdi2,
            //    s.EczaneId1,
            //    s.EczaneId2
            //})
            //.Distinct()
            //.ToList();
            //.Where(w => w.NobetGorevTipId1 == 1 && w.NobetGorevTipId2 == 1).ToList();

            //var ikiliEczaneler2 = new List<AyniGunTutulanNobetDetay>();

            //foreach (var ikiliEczane in ikiliEczaneler)
            //{
            //    ikiliEczaneler2.Add(new AyniGunTutulanNobetDetay
            //    {
            //        EczaneId1 = ikiliEczane.EczaneId1,
            //        EczaneId2 = ikiliEczane.EczaneId2,
            //        EczaneAdi1 = ikiliEczane.EczaneAdi1,
            //        EczaneAdi2 = ikiliEczane.EczaneAdi2
            //    });
            //}

            var eczaneNobetIstekler = _eczaneNobetIstekService.GetDetaylarByNobetGrupIdList(baslangicTarihi, bitisTarihi, nobetGrupIdListe)
                                      .Where(w => eczaneNobetGruplarTumu.Select(s => s.EczaneId).Contains(w.EczaneId)).ToList();

            var eczaneNobetMazeretler = _eczaneNobetMazeretService.GetDetaylarByEczaneIdList(baslangicTarihi, bitisTarihi, eczaneNobetGruplarTumu.Select(s => s.EczaneId).Distinct().ToList())
                                        .Where(w => w.MazeretId != 3)
                                        .ToList();

            var takvimNobetGrupGunDegerIstatistikler = _takvimService.GetTakvimNobetGrupGunDegerIstatistikler(nobetUstGrupBaslangicTarihi, bitisTarihi, nobetGrupGorevTipler);

            var eczaneNobetGrupAltGruplar = _eczaneNobetGrupAltGrupService.GetDetaylar(nobetUstGrupId);

            #region alt Gruplarla Aynı Gün Nöbet Tutma

            var altGruplarlaAyniGunNobetTutma = _nobetUstGrupKisitService.GetDetay("altGruplarlaAyniGunNobetTutma", nobetUstGrupId);

            var eczaneNobetSonuclarAltGruplaAyniGun = new List <EczaneNobetSonucListe2>();
            var altGruplarlaAyniGunNobetTutmayacakEczanelerSehirDisi = new List <EczaneGrupDetay>();
            var altGruplarlaAyniGunNobetTutmayacakEczanelerSehirIci1 = new List <EczaneGrupDetay>();
            var altGruplarlaAyniGunNobetTutmayacakEczanelerSehirIci2 = new List <EczaneGrupDetay>();

            if (!altGruplarlaAyniGunNobetTutma.PasifMi)
            {
                eczaneNobetSonuclarAltGruplaAyniGun = eczaneNobetSonuclar
                                                      .Where(w => eczaneNobetGruplarGorevTip1.Select(s => s.NobetGorevTipId).Contains(w.NobetGorevTipId)).ToList();

                #region 13 - 11,12

                var ayniGunNobetTutmasiTakipEdilecekAltGruplar = new List <int>
                {
                    13 //Şehir dışı (doğu + batı)
                };

                var altGrubuOlanNobetGruplar = new List <int>
                {
                    11, //Şehir içi (merkez-1)
                    12  //Şehir içi (merkez-2)
                };

                altGruplarlaAyniGunNobetTutmayacakEczanelerSehirDisi = _eczaneNobetOrtakService.AltGruplarlaSiraliNobetListesiniOlusturGiresun(eczaneNobetSonuclarAltGruplaAyniGun,
                                                                                                                                               eczaneNobetGruplarGorevTip1,
                                                                                                                                               eczaneNobetGrupAltGruplar,
                                                                                                                                               altGruplarlaAyniGunNobetTutma,
                                                                                                                                               nobetUstGrupBaslangicTarihi,
                                                                                                                                               0,
                                                                                                                                               ayniGunNobetTutmasiTakipEdilecekAltGruplar,
                                                                                                                                               altGrubuOlanNobetGruplar);

                #endregion

                #region 11 - 12,13

                ayniGunNobetTutmasiTakipEdilecekAltGruplar = new List <int>
                {
                    11//Şehir içi (merkez-1)
                };

                altGrubuOlanNobetGruplar = new List <int>
                {
                    12, //Şehir içi (merkez-2)
                    13  //Şehir dışı (doğu + batı)
                };

                altGruplarlaAyniGunNobetTutmayacakEczanelerSehirIci1 = _eczaneNobetOrtakService.AltGruplarlaSiraliNobetListesiniOlusturGiresun(eczaneNobetSonuclarAltGruplaAyniGun,
                                                                                                                                               eczaneNobetGruplarGorevTip1,
                                                                                                                                               eczaneNobetGrupAltGruplar,
                                                                                                                                               altGruplarlaAyniGunNobetTutma,
                                                                                                                                               nobetUstGrupBaslangicTarihi,
                                                                                                                                               0,
                                                                                                                                               ayniGunNobetTutmasiTakipEdilecekAltGruplar,
                                                                                                                                               altGrubuOlanNobetGruplar);

                #endregion

                #region 12 - 11,13

                ayniGunNobetTutmasiTakipEdilecekAltGruplar = new List <int>
                {
                    12//Şehir içi (merkez-2)
                };

                altGrubuOlanNobetGruplar = new List <int>
                {
                    11, //Şehir içi (merkez-1)
                    13  //Şehir dışı (doğu + batı)
                };

                altGruplarlaAyniGunNobetTutmayacakEczanelerSehirIci2 = _eczaneNobetOrtakService.AltGruplarlaSiraliNobetListesiniOlusturGiresun(eczaneNobetSonuclarAltGruplaAyniGun,
                                                                                                                                               eczaneNobetGruplarGorevTip1,
                                                                                                                                               eczaneNobetGrupAltGruplar,
                                                                                                                                               altGruplarlaAyniGunNobetTutma,
                                                                                                                                               nobetUstGrupBaslangicTarihi,
                                                                                                                                               0,
                                                                                                                                               ayniGunNobetTutmasiTakipEdilecekAltGruplar,
                                                                                                                                               altGrubuOlanNobetGruplar);

                #endregion
            }

            #endregion

            #region önceki aylar aynı gün nöbet tutanlar çözülen ayda aynı gün nöbetçi olmasın

            var oncekiAylardaAyniGunNobetTutanEczaneler = new List <EczaneGrupDetay>();

            var oncekiAylarAyniGunNobet = _nobetUstGrupKisitService.GetDetay("oncekiAylarAyniGunNobet", nobetUstGrupId);

            if (!oncekiAylarAyniGunNobet.PasifMi)
            {
                oncekiAylardaAyniGunNobetTutanEczaneler = _eczaneNobetSonucService.OncekiAylardaAyniGunNobetTutanlar(baslangicTarihi, eczaneNobetSonuclarOncekiAylar, 0, (int)oncekiAylarAyniGunNobet.SagTarafDegeri);
            }

            #endregion

            var nobetGrupKurallar = _nobetGrupKuralService.GetDetaylarByNobetGrupGorevTipIdList(nobetGrupGorevTipler.Select(s => s.Id).ToList());

            var nobetUstGrupKisitlar = _nobetUstGrupKisitService.GetDetaylar(nobetUstGrupId);
            var grupBazliKisitlar    = _nobetGrupGorevTipKisitService.GetDetaylar(nobetUstGrupId);

            var giresunDataModel = new GiresunDataModel()
            {
                Yil                         = eczaneNobetDataModelParametre.YilBaslangic,
                Ay                          = eczaneNobetDataModelParametre.AyBitis,
                TimeLimit                   = eczaneNobetDataModelParametre.TimeLimit,
                CalismaSayisiLimit          = eczaneNobetDataModelParametre.CalismaSayisi,
                LowerBound                  = 0,
                UpperBound                  = 1,
                BaslangicTarihi             = baslangicTarihi,
                BitisTarihi                 = bitisTarihi,
                NobetUstGrupBaslangicTarihi = nobetUstGrupBaslangicTarihi,
                NobetUstGrupId              = nobetUstGrupId,
                EczaneNobetTarihAralik      = eczaneNobetTarihAralik,  //karar değişkeni
                EczaneKumulatifHedefler     = eczaneKumulatifHedefler, //.Where(w => w.EczaneId != 121).ToList(),
                EczaneNobetIstatistikler    = eczaneNobetIstatistikler,
                EczaneNobetMazeretler       = eczaneNobetMazeretler,
                EczaneGrupTanimlar          = eczaneGrupTanimlar,
                TarihAraligi                = tarihAralik,
                NobetGruplar                = nobetGruplar,
                EczaneGruplar               = eczaneGruplar2,
                //AyniGunNobetTutanEsGruplar = ayniGunNoetTutanEczaneGruplar,
                AltGruplarlaAyniGunNobetTutmayacakEczanelerSehirDisi = altGruplarlaAyniGunNobetTutmayacakEczanelerSehirDisi,
                AltGruplarlaAyniGunNobetTutmayacakEczanelerSehirIci1 = altGruplarlaAyniGunNobetTutmayacakEczanelerSehirIci1,
                AltGruplarlaAyniGunNobetTutmayacakEczanelerSehirIci2 = altGruplarlaAyniGunNobetTutmayacakEczanelerSehirIci2,
                OncekiAylardaAyniGunNobetTutanEczaneler = oncekiAylardaAyniGunNobetTutanEczaneler,
                EczaneNobetIstekler          = eczaneNobetIstekler,
                NobetGrupGunKurallar         = _nobetGrupGunKuralService.GetAktifList(nobetGrupIdListe),
                NobetGrupGorevTipGunKurallar = _nobetGrupGorevTipGunKuralService.GetDetaylarAktifList(nobetGrupGorevTipler.Select(s => s.Id).ToList()),
                NobetGrupKurallar            = nobetGrupKurallar,
                NobetGrupGorevTipler         = nobetGrupGorevTipler,
                NobetGrupTalepler            = _nobetGrupTalepService.GetDetaylar(nobetGrupIdListe, baslangicTarihi, bitisTarihi),
                EczaneNobetGruplar           = eczaneNobetGruplarTumu,
                Kisitlar = nobetUstGrupKisitlar,
                EczaneGrupNobetSonuclar                      = eczaneGrupNobetSonuclar,
                EczaneNobetSonuclar                          = eczaneNobetSonuclarCozulenGruplar,
                EczaneGrupNobetSonuclarTumu                  = eczaneNobetSonuclar,
                EczaneNobetSonuclarAltGruplarlaBirlikte      = eczaneNobetSonuclarAltGruplaAyniGun,
                EczaneNobetGrupGunKuralIstatistikler         = enSonNobetler,
                TakvimNobetGrupGunDegerIstatistikler         = takvimNobetGrupGunDegerIstatistikler,
                EczaneNobetGrupGunKuralIstatistikYatay       = eczaneNobetGrupGunKuralIstatistikYatay,
                EczaneNobetGrupGunKuralIstatistikYataySon3Ay = eczaneNobetGrupGunKuralIstatistikYataySon3Ay,
                EczaneBazliGunKuralIstatistikYatay           = eczaneBazliGunKuralIstatistikYatay,
                EczaneNobetGrupAltGruplar                    = eczaneNobetGrupAltGruplar,
                NobetGrupGorevTipKisitlar                    = grupBazliKisitlar,
                IkiliEczaneler          = ikiliEczaneler,
                DebugYapilacakEczaneler = debugYapilacakEczaneler
            };

            //_eczaneNobetOrtakService.KurallariKontrolEtHaftaIciEnAzEnCok(nobetUstGrupId, eczaneNobetGrupGunKuralIstatistikYatay);
            _eczaneNobetOrtakService.KurallariKontrolEtMazeretIstek(nobetUstGrupId, eczaneNobetMazeretler, eczaneNobetIstekler);
            _eczaneNobetOrtakService.KurallariKontrolEtIstek(nobetUstGrupId, eczaneNobetIstekler, nobetGrupKurallar);

            return(giresunDataModel);
        }
        private MersinMerkezDataModelV2 EczaneNobetDataModel(EczaneNobetDataModelParametre eczaneNobetDataModelParametre)
        {
            #region parametreler
            var nobetUstGrupId   = eczaneNobetDataModelParametre.NobetUstGrupId;
            var yilBaslangic     = eczaneNobetDataModelParametre.YilBaslangic;
            var yilBitis         = eczaneNobetDataModelParametre.YilBitis;
            var ayBaslangic      = eczaneNobetDataModelParametre.AyBaslangic;
            var ayBitis          = eczaneNobetDataModelParametre.AyBitis;
            var nobetGrupIdListe = eczaneNobetDataModelParametre.NobetGrupId.ToList();
            //var nobetGorevTipId = eczaneNobetDataModelParametre.NobetGorevTipId;
            var nobetUstGrupBaslangicTarihi = eczaneNobetDataModelParametre.NobetUstGrupBaslangicTarihi;
            var ayBitisBaslangicGunu        = eczaneNobetDataModelParametre.AyBitisBaslangicGunu;
            var ayBitisBitisGunu            = eczaneNobetDataModelParametre.AyBitisBitisGunu;

            var baslangicTarihi      = eczaneNobetDataModelParametre.BaslangicTarihi;
            var bitisTarihi          = eczaneNobetDataModelParametre.BitisTarihi;
            var nobetGrupGorevTipler = eczaneNobetDataModelParametre.NobetGrupGorevTipler;
            var nobetGorevTipId      = nobetGrupGorevTipler.FirstOrDefault().NobetGorevTipId;

            #endregion

            if (baslangicTarihi < nobetUstGrupBaslangicTarihi)
            {
                throw new Exception($"Nöbet başlangıç tarihi <strong>({baslangicTarihi.ToShortDateString()})</strong> üst grup başlama tarihinden <strong>({nobetUstGrupBaslangicTarihi.ToShortDateString()})</strong> küçük olamaz.");
            }

            var debugYapilacakEczaneler = _debugEczaneService.GetDetaylarAktifOlanlar(nobetUstGrupId);

            var nobetGruplar = _nobetGrupService.GetDetaylar(nobetGrupIdListe).OrderBy(s => s.Id).ToList();
            //var nobetGrupGorevTipler = _nobetGrupGorevTipService.GetDetaylar(nobetGorevTipId, nobetGrupIdListe);
            var eczaneNobetSonuclar = _eczaneNobetSonucService.GetSonuclar(nobetUstGrupId); //nobetGrupIdListe
            //.Where(w => !(w.EczaneNobetGrupId == 301 && w.TakvimId == 88)).ToList();
            //.Where(w => w.Tarih.Year > 2017).ToList();

            var eczaneNobetMazeretNobettenDusenler = new List <EczaneNobetMazeretSayilari>();

            var mazeret = _nobetUstGrupKisitService.GetKisitPasifMi("mazeret", nobetUstGrupId);

            if (mazeret)
            {
                eczaneNobetMazeretNobettenDusenler = _eczaneNobetMazeretService.GetEczaneNobetMazeretSayilari(baslangicTarihi, bitisTarihi, nobetGrupIdListe);
            }

            var eczaneNobetGruplar = _eczaneNobetGrupService.GetDetaylar(nobetGrupIdListe, baslangicTarihi, bitisTarihi)
                                     .Where(w => !eczaneNobetMazeretNobettenDusenler.Select(s => s.EczaneNobetGrupId).Contains(w.Id)).ToList();

            var eczaneNobetSonuclarCozulenGruplar = eczaneNobetSonuclar
                                                    .Where(w => eczaneNobetGruplar.Select(s => s.Id).Contains(w.EczaneNobetGrupId)).ToList();

            var eczaneNobetSonuclarBaslamaTarihindenSonrasi = eczaneNobetSonuclarCozulenGruplar
                                                              .Where(w => w.Tarih >= nobetUstGrupBaslangicTarihi).ToList();

            var son3Ay = baslangicTarihi.AddMonths(-3);

            var eczaneNobetSonuclarSon3Ay = eczaneNobetSonuclarCozulenGruplar
                                            .Where(w => w.Tarih >= son3Ay).ToList();

            var sonuclarKontrol = _eczaneNobetSonucService.GetSonuclar(baslangicTarihi, bitisTarihi, eczaneNobetSonuclarCozulenGruplar);

            if (sonuclarKontrol.Count > 0)
            {
                throw new Exception("Kriterlere uygun <strong>daha önce yazılmış nöbetler</strong> bulunmaktadır. Lütfen kontrol ediniz!");
            }

            var enSonNobetler = _eczaneNobetOrtakService.GetEczaneNobetGrupGunKuralIstatistik(eczaneNobetGruplar, eczaneNobetSonuclarCozulenGruplar);

            var enSonNobetlerSon3Ay = _eczaneNobetOrtakService.GetEczaneNobetGrupGunKuralIstatistik(eczaneNobetGruplar, eczaneNobetSonuclarSon3Ay);

            var eczaneNobetGrupGunKuralIstatistikYatay = _eczaneNobetOrtakService.GetEczaneNobetGrupGunKuralIstatistikYatay(enSonNobetler);

            var eczaneNobetGrupGunKuralIstatistikYataySon3Ay = _eczaneNobetOrtakService.GetEczaneNobetGrupGunKuralIstatistikYatay(enSonNobetlerSon3Ay);

            var grupluEczaneNobetSonuclar = _eczaneNobetSonucService.GetSonuclar(baslangicTarihi, bitisTarihi, eczaneNobetSonuclar);

            var eczaneGrupEdges = _eczaneGrupService.GetEdges()
                                  .Where(e => (nobetGrupIdListe.Contains(e.FromNobetGrupId) ||
                                               nobetGrupIdListe.Contains(e.ToNobetGrupId)))
                                  .Where(w => (grupluEczaneNobetSonuclar.Select(s => s.EczaneId).Distinct().Contains(w.From) ||
                                               grupluEczaneNobetSonuclar.Select(s => s.EczaneId).Distinct().Contains(w.To))
                                         ).ToList();

            //sonuçlarda ilişkili eczaneler
            var eczaneGruplar = _eczaneGrupService.GetDetaylarAktifGruplar(nobetUstGrupId)
                                .Where(x => (eczaneGrupEdges.Select(s => s.From).Distinct().Contains(x.EczaneId) || eczaneGrupEdges.Select(s => s.To).Distinct().Contains(x.EczaneId)) ||
                                       nobetGrupIdListe.Contains(x.NobetGrupId)
                                       ).ToList();

            //fazladan gelen tanımlar var iyileştirmekte fayda var
            var eczaneGrupTanimlar = _eczaneGrupTanimService.GetDetaylarAktifTanimList(eczaneGruplar.Select(x => x.EczaneGrupTanimId).ToList());
            var eczaneGruplar2     = _eczaneGrupService.GetDetaylarByEczaneGrupTanimId(eczaneGrupTanimlar.Select(s => s.Id).ToList());

            var eczaneGrupNobetSonuclar = grupluEczaneNobetSonuclar
                                          .Where(w => eczaneGruplar2.Select(s => s.EczaneId).Contains(w.EczaneId)).ToList();

            //nöbet yazılacak tarih aralığı(örn. Ocak ayının tüm günleri)
            var tarihAralik = _takvimService.GetTakvimNobetGruplar(baslangicTarihi, bitisTarihi, nobetGrupIdListe, nobetGorevTipId);

            //var tarihAralikAltGrupluGruplar = _takvimService.GetTakvimNobetGrupAltGruplar(baslangicTarihi, bitisTarihi, nobetGrupIdListe, nobetGorevTipId);

            var eczaneKumulatifHedefler  = new List <EczaneNobetIstatistik>();
            var eczaneNobetIstatistikler = new List <EczaneNobetIstatistik>();

            var eczaneNobetTarihAralik1 = _takvimService.GetEczaneNobetTarihAralik(baslangicTarihi, bitisTarihi, nobetGorevTipId, nobetGrupIdListe)
                                          .Where(w => eczaneNobetGruplar.Select(s => s.EczaneId).Contains(w.EczaneId)).ToList();

            var eczaneNobetTarihAralik = _eczaneNobetOrtakService.AmacFonksiyonuKatsayisiBelirle(eczaneNobetTarihAralik1, eczaneNobetGrupGunKuralIstatistikYatay);

            var takipEdilecekEczaneler = new List <int> {
                664
            };

            var ikiliEczaneler = _ayniGunTutulanNobetService.GetDetaylar(nobetGrupIdListe)
                                 .Where(w => //(eczaneNobetGruplar.Select(s => s.EczaneId).Contains(w.EczaneId1)
                                             //|| eczaneNobetGruplar.Select(s => s.EczaneId).Contains(w.EczaneId2))
                                             //  (takipEdilecekEczaneler.Contains(w.EczaneNobetGrupId1)
                                             //|| takipEdilecekEczaneler.Contains(w.EczaneNobetGrupId2))
                                        (
                                            (w.EczaneAdi1 == "ÖYKÜ" && w.EczaneAdi2 == "ALTUNBAŞ") ||
                                            (w.EczaneAdi1 == "ÖYKÜ" && w.EczaneAdi2 == "GÜLÇİN") ||
                                            (w.EczaneAdi1 == "TATLIDİL" && w.EczaneAdi2 == "ANIT") ||
                                            (w.EczaneAdi1 == "DİCLE" && w.EczaneAdi2 == "AYSEL") ||
                                            (w.EczaneAdi1 == "POLEN" && w.EczaneAdi2 == "SİTELER") ||
                                            (w.EczaneAdi1 == "RÜYA" && w.EczaneAdi2 == "AYFER")
                                        )

                                        //(
                                        //   (w.NobetGrupId1 == 15 && w.NobetGrupId2 == 16) //toroslar 1-2

                                        //|| (w.NobetGrupId1 == 17 && w.NobetGrupId2 == 18) //Akdeniz 1-2
                                        //|| (w.NobetGrupId1 == 17 && w.NobetGrupId2 == 19) //Akdeniz 1-3
                                        //|| (w.NobetGrupId1 == 18 && w.NobetGrupId2 == 19) //Akdeniz 2-3

                                        //|| (w.NobetGrupId1 == 20 && w.NobetGrupId2 == 21) //Yenişehir 1-2
                                        //|| (w.NobetGrupId1 == 20 && w.NobetGrupId2 == 22) //Yenişehir 1-3
                                        //|| (w.NobetGrupId1 == 21 && w.NobetGrupId2 == 22) //Yenişehir 2-3

                                        //|| (w.NobetGrupId1 == 23 && w.NobetGrupId2 == 24) //Mezitli 1-2
                                        //)
                                        ).ToList();

            //2. karar değişkeni. her eczane ve ilgili altgrup
            var eczaneNobetAltGrupTarihAralik = _takvimService.GetEczaneNobetAltGrupTarihAralik(baslangicTarihi, bitisTarihi, nobetGorevTipId, nobetGrupIdListe)
                                                .Where(w => eczaneNobetGruplar.Select(s => s.EczaneId).Contains(w.EczaneId)).ToList();

            var eczaneNobetIstekler = _eczaneNobetIstekService.GetDetaylarByNobetGrupIdList(baslangicTarihi, bitisTarihi.AddDays(10), nobetGrupIdListe)
                                      .Where(w => eczaneNobetGruplar.Select(s => s.EczaneId).Contains(w.EczaneId)).ToList();

            var eczaneNobetMazeretler = _eczaneNobetMazeretService.GetDetaylarByEczaneIdList(baslangicTarihi, bitisTarihi, eczaneNobetGruplar.Select(s => s.EczaneId).Distinct().ToList())
                                        .Where(w => w.MazeretId != 3)
                                        .ToList();

            var takvimNobetGrupGunDegerIstatistikler = _takvimService.GetTakvimNobetGrupGunDegerIstatistikler(nobetUstGrupBaslangicTarihi, bitisTarihi, nobetGrupGorevTipler);

            var eczaneNobetGrupAltGruplarYenisehir2 = _eczaneNobetGrupAltGrupService.GetDetaylarByNobetGrupId(21);
            var eczaneNobetGrupAltGruplarToroslar1  = _eczaneNobetGrupAltGrupService.GetDetaylarByNobetGrupId(15);

            var altGruplarlaAyniGunNobetTutma         = _nobetUstGrupKisitService.GetDetay("altGruplarlaAyniGunNobetTutma", nobetUstGrupId);
            var altGruplarlaAyniGunNobetTutmaToroslar = _nobetUstGrupKisitService.GetDetay("altGruplarlaAyniGunNobetTutmaToroslar", nobetUstGrupId);

            var eczaneNobetSonuclarAltGruplaAyniGun         = new List <EczaneNobetSonucListe2>();
            var eczaneNobetSonuclarAltGruplaAyniGunToroslar = new List <EczaneNobetSonucListe2>();

            var indisId = 0;

            var altGruplarlaAyniGunNobetTutmayacakEczanelerYeniSehir1_2 = new List <EczaneGrupDetay>();
            var altGruplarlaAyniGunNobetTutmayacakEczanelerYeniSehir3_2 = new List <EczaneGrupDetay>();
            var altGruplarlaAyniGunNobetTutmayacakEczanelerToroslar     = new List <EczaneGrupDetay>();

            if (!altGruplarlaAyniGunNobetTutma.PasifMi)
            {
                //indisId = eczaneGruplar2.Select(s => s.EczaneGrupTanimId).Max();

                #region yenişehir

                var altGrupluTakipEdilecekNobetGrupIdList =
                    new List <int> {
                    20,                        //Yenişehir-1
                    21,                        //Yenişehir-2 - alt grubu olan
                    22                         //Yenişehir-3
                };

                var eczaneNobetGruplarAltGruplaAyniGun = _eczaneNobetGrupService.GetDetaylar(altGrupluTakipEdilecekNobetGrupIdList, baslangicTarihi, bitisTarihi)
                                                         .Where(w => !eczaneNobetMazeretNobettenDusenler.Select(s => s.EczaneNobetGrupId).Contains(w.Id)).ToList();

                eczaneNobetSonuclarAltGruplaAyniGun = eczaneNobetSonuclar
                                                      .Where(w => altGrupluTakipEdilecekNobetGrupIdList.Contains(w.NobetGrupId)).ToList();

                var ayniGunNobetTutmasiTakipEdilecekGruplar_1 = new List <int>
                {
                    20,    //Yenişehir-1,
                           //22 //Yenişehir-3 (M.Ü. Hastanesi)
                };

                var ayniGunNobetTutmasiTakipEdilecekGruplar_3 = new List <int>
                {
                    //20,//Yenişehir-1,
                    22     //Yenişehir-3 (M.Ü. Hastanesi)
                };

                var altGrubuOlanNobetGruplar = new List <int>
                {
                    21    //Yenişehir-2
                };

                altGruplarlaAyniGunNobetTutmayacakEczanelerYeniSehir1_2 = _eczaneNobetOrtakService.AltGruplarlaSiraliNobetListesiniOlusturMersin(
                    eczaneNobetSonuclarAltGruplaAyniGun,
                    eczaneNobetGruplarAltGruplaAyniGun,
                    eczaneNobetGrupAltGruplarYenisehir2,
                    altGruplarlaAyniGunNobetTutma,
                    nobetUstGrupBaslangicTarihi,
                    indisId,
                    ayniGunNobetTutmasiTakipEdilecekGruplar_1,
                    altGrubuOlanNobetGruplar,
                    0,
                    (int)altGruplarlaAyniGunNobetTutma.SagTarafDegeri);

                altGruplarlaAyniGunNobetTutmayacakEczanelerYeniSehir3_2 = _eczaneNobetOrtakService.AltGruplarlaSiraliNobetListesiniOlusturMersin(
                    eczaneNobetSonuclarAltGruplaAyniGun,
                    eczaneNobetGruplarAltGruplaAyniGun,
                    eczaneNobetGrupAltGruplarYenisehir2,
                    altGruplarlaAyniGunNobetTutma,
                    nobetUstGrupBaslangicTarihi,
                    indisId,
                    ayniGunNobetTutmasiTakipEdilecekGruplar_3,
                    altGrubuOlanNobetGruplar,
                    0,
                    (int)altGruplarlaAyniGunNobetTutma.SagTarafDegeri);
                #endregion
            }

            if (!altGruplarlaAyniGunNobetTutmaToroslar.PasifMi)
            {
                #region toroslar

                var altGrupluTakipEdilecekNobetGrupIdListToroslar =
                    new List <int> {
                    15,                        //Toroslar-1 - alt grubu olan
                    16                         //Toroslar-2
                };

                var eczaneNobetGruplarAltGruplaAyniGunToroslar = _eczaneNobetGrupService.GetDetaylar(altGrupluTakipEdilecekNobetGrupIdListToroslar, baslangicTarihi, bitisTarihi)
                                                                 .Where(w => !eczaneNobetMazeretNobettenDusenler.Select(s => s.EczaneNobetGrupId).Contains(w.Id)).ToList();

                eczaneNobetSonuclarAltGruplaAyniGunToroslar = eczaneNobetSonuclar
                                                              .Where(w => altGrupluTakipEdilecekNobetGrupIdListToroslar.Contains(w.NobetGrupId)).ToList();

                var ayniGunNobetTutmasiTakipEdilecekGruplarToroslar = new List <int>
                {
                    16,    //Toroslar-1,
                };

                var altGrubuOlanNobetGruplarToroslar = new List <int>
                {
                    15    //Toroslar-2
                };

                altGruplarlaAyniGunNobetTutmayacakEczanelerToroslar = _eczaneNobetOrtakService
                                                                      .AltGruplarlaSiraliNobetListesiniOlusturMersin(eczaneNobetSonuclarAltGruplaAyniGunToroslar, eczaneNobetGruplarAltGruplaAyniGunToroslar, eczaneNobetGrupAltGruplarToroslar1,
                                                                                                                     altGruplarlaAyniGunNobetTutma, nobetUstGrupBaslangicTarihi, 1,
                                                                                                                     ayniGunNobetTutmasiTakipEdilecekGruplarToroslar, altGrubuOlanNobetGruplarToroslar, 0, (int)altGruplarlaAyniGunNobetTutmaToroslar.SagTarafDegeri);

                #endregion
            }

            #region ikili eczaneler

            var ikiliEczaneAyniGunNobet = _nobetUstGrupKisitService.GetDetay("ikiliEczaneAyniGunNobet", nobetUstGrupId);

            var arasindaAyniGun2NobetFarkiOlanIkiliEczaneler = new List <EczaneGrupDetay>();

            if (!ikiliEczaneAyniGunNobet.PasifMi)
            {
                //indisId = eczaneGruplar2.Select(s => s.EczaneGrupTanimId).Max();
                arasindaAyniGun2NobetFarkiOlanIkiliEczaneler = _ayniGunTutulanNobetService.GetArasinda2FarkOlanIkiliEczaneleri(
                    eczaneNobetGruplar,
                    nobetGrupGorevTipler.Select(s => s.Id).ToArray(),
                    (int)ikiliEczaneAyniGunNobet.SagTarafDegeri);
            }

            #endregion

            #region önceki aylar aynı gün nöbet tutanlar çözülen ayda aynı gün nöbetçi olmasın

            var oncekiAylardaAyniGunNobetTutanEczaneler = new List <EczaneGrupDetay>();

            var oncekiAylarAyniGunNobet = _nobetUstGrupKisitService.GetDetay("oncekiAylarAyniGunNobet", nobetUstGrupId);

            if (!oncekiAylarAyniGunNobet.PasifMi && (int)oncekiAylarAyniGunNobet.SagTarafDegeri > 0)
            {
                indisId = eczaneGruplar2.Select(s => s.EczaneGrupTanimId).Max();
                oncekiAylardaAyniGunNobetTutanEczaneler = _eczaneNobetSonucService.OncekiAylardaAyniGunNobetTutanlar(
                    baslangicTarihi,
                    eczaneNobetSonuclarBaslamaTarihindenSonrasi,
                    indisId,
                    (int)oncekiAylarAyniGunNobet.SagTarafDegeri);
            }

            #endregion

            #region sonraki aydaki istekler
            var sonrakiAy            = bitisTarihi.AddDays(1);
            var bitisTarihiSonrakiAy = bitisTarihi.AddMonths((int)oncekiAylarAyniGunNobet.SagTarafDegeri + 2);

            var eczaneNobetIsteklerSonrakiDonem = _eczaneNobetIstekService.GetDetaylarByNobetGrupIdList(sonrakiAy, bitisTarihiSonrakiAy, nobetGrupIdListe)
                                                  .Where(w => eczaneNobetGruplar.Select(s => s.EczaneId).Contains(w.EczaneId)).ToList();

            var sonrakiDonemAyniGunNobetIstekGirilenler = _eczaneNobetIstekService.SonrakiAylardaAyniGunIstekGirilenEczaneler(eczaneNobetIsteklerSonrakiDonem);
            #endregion

            var nobetGrupKurallar = _nobetGrupKuralService.GetDetaylar(nobetGrupIdListe);

            var nobetUstGrupKisitlar = _nobetUstGrupKisitService.GetDetaylar(nobetUstGrupId);
            var grupBazliKisitlar    = _nobetGrupGorevTipKisitService.GetDetaylar(nobetUstGrupId);

            var dataModel = new MersinMerkezDataModelV2()
            {
                Yil                                                     = yilBitis,
                Ay                                                      = ayBitis,
                LowerBound                                              = 0,
                UpperBound                                              = 1,
                TimeLimit                                               = eczaneNobetDataModelParametre.TimeLimit,
                CalismaSayisiLimit                                      = eczaneNobetDataModelParametre.CalismaSayisi,
                BaslangicTarihi                                         = baslangicTarihi,
                BitisTarihi                                             = bitisTarihi,
                NobetUstGrupBaslangicTarihi                             = nobetUstGrupBaslangicTarihi,
                NobetUstGrupId                                          = nobetUstGrupId,
                EczaneNobetTarihAralik                                  = eczaneNobetTarihAralik,                   //karar değişkeni
                EczaneNobetTarihAralikIkiliEczaneler                    = new List <EczaneNobetTarihAralikIkili>(), //eczaneNobetTarihAralikIkiliEczaneler,
                EczaneKumulatifHedefler                                 = eczaneKumulatifHedefler,                  //.Where(w => w.EczaneId != 121).ToList(),
                EczaneNobetIstatistikler                                = eczaneNobetIstatistikler,
                EczaneNobetMazeretler                                   = eczaneNobetMazeretler,
                EczaneGrupTanimlar                                      = eczaneGrupTanimlar,
                TarihAraligi                                            = tarihAralik,
                NobetGruplar                                            = nobetGruplar,
                EczaneGruplar                                           = eczaneGruplar2,
                ArasindaAyniGun2NobetFarkiOlanIkiliEczaneler            = arasindaAyniGun2NobetFarkiOlanIkiliEczaneler,
                OncekiAylardaAyniGunNobetTutanEczaneler                 = oncekiAylardaAyniGunNobetTutanEczaneler,
                AltGruplarlaAyniGunNobetTutmayacakEczanelerYenisehir1_2 = altGruplarlaAyniGunNobetTutmayacakEczanelerYeniSehir1_2,
                AltGruplarlaAyniGunNobetTutmayacakEczanelerYenisehir3_2 = altGruplarlaAyniGunNobetTutmayacakEczanelerYeniSehir3_2,
                AltGruplarlaAyniGunNobetTutmayacakEczanelerToroslar     = altGruplarlaAyniGunNobetTutmayacakEczanelerToroslar,

                EczaneNobetIstekler     = eczaneNobetIstekler,
                NobetGrupGunKurallar    = _nobetGrupGunKuralService.GetDetaylarAktifList(nobetGrupIdListe),
                NobetGrupKurallar       = nobetGrupKurallar,
                NobetGrupGorevTipler    = nobetGrupGorevTipler,
                NobetGrupTalepler       = _nobetGrupTalepService.GetDetaylar(nobetGrupIdListe, baslangicTarihi, bitisTarihi),
                EczaneNobetGruplar      = eczaneNobetGruplar,
                Kisitlar                = nobetUstGrupKisitlar,
                EczaneGrupNobetSonuclar = eczaneGrupNobetSonuclar,
                //EczaneNobetSonuclarAltGruplarlaBirlikte = eczaneNobetSonuclarAltGruplaAyniGun,
                EczaneNobetSonuclar                          = eczaneNobetSonuclarCozulenGruplar,
                EczaneGrupNobetSonuclarTumu                  = eczaneNobetSonuclar,
                EczaneNobetGrupGunKuralIstatistikler         = enSonNobetler,
                TakvimNobetGrupGunDegerIstatistikler         = takvimNobetGrupGunDegerIstatistikler,
                EczaneNobetGrupGunKuralIstatistikYatay       = eczaneNobetGrupGunKuralIstatistikYatay,
                EczaneNobetGrupGunKuralIstatistikYataySon3Ay = eczaneNobetGrupGunKuralIstatistikYataySon3Ay,
                EczaneNobetGrupAltGruplar                    = new List <EczaneNobetGrupAltGrupDetay>(), //eczaneNobetGrupAltGruplar,
                EczaneNobetAltGrupTarihAralik                = eczaneNobetAltGrupTarihAralik,

                IkiliEczaneler = ikiliEczaneler,
                SonrakiDonemAyniGunNobetIstekGirilenler = sonrakiDonemAyniGunNobetIstekGirilenler,
                NobetGrupGorevTipKisitlar = grupBazliKisitlar,
                Kalibrasyonlar            = _kalibrasyonService.GetKalibrasyonlarYatay(nobetUstGrupId),
                DebugYapilacakEczaneler   = debugYapilacakEczaneler
            };

            //_eczaneNobetOrtakService.KurallariKontrolEtHaftaIciEnAzEnCok(nobetUstGrupId, eczaneNobetGrupGunKuralIstatistikYatay);
            _eczaneNobetOrtakService.KurallariKontrolEtMazeretIstek(nobetUstGrupId, eczaneNobetMazeretler, eczaneNobetIstekler);
            _eczaneNobetOrtakService.KurallariKontrolEtIstek(nobetUstGrupId, eczaneNobetIstekler, nobetGrupKurallar);

            return(dataModel);
        }
예제 #6
0
        private AlanyaDataModelEski EczaneNobetDataModel(EczaneNobetDataModelParametre eczaneNobetDataModelParametre)
        {
            #region parametreler
            var nobetUstGrupId   = eczaneNobetDataModelParametre.NobetUstGrupId;
            var yilBaslangic     = eczaneNobetDataModelParametre.YilBaslangic;
            var yilBitis         = eczaneNobetDataModelParametre.YilBitis;
            var ayBaslangic      = eczaneNobetDataModelParametre.AyBaslangic;
            var ayBitis          = eczaneNobetDataModelParametre.AyBitis;
            var nobetGrupIdListe = eczaneNobetDataModelParametre.NobetGrupId.ToList();
            var nobetGorevTipId  = eczaneNobetDataModelParametre.NobetGorevTipId;
            #endregion

            var baslangicTarihi = new DateTime(yilBitis, ayBitis, 1);
            var bitisTarihi     = baslangicTarihi.AddMonths(1);
            var nobetGruplar    = _nobetGrupService.GetList(nobetGrupIdListe).OrderBy(s => s.Id).ToList();
            var eczaneNobetMazeretNobettenDusenler = _eczaneNobetMazeretService.GetEczaneNobetMazeretSayilari(baslangicTarihi, bitisTarihi, nobetGrupIdListe);
            var eczaneNobetSonuclarAylik           = _eczaneNobetSonucService.GetSonuclar(baslangicTarihi, bitisTarihi, nobetUstGrupId);

            var eczaneGrupEdges = _eczaneGrupService.GetEdges(nobetUstGrupId)
                                  .Where(e => (nobetGrupIdListe.Contains(e.FromNobetGrupId) || nobetGrupIdListe.Contains(e.ToNobetGrupId)))
                                  .Where(w => (eczaneNobetSonuclarAylik.Select(s => s.EczaneId).Distinct().Contains(w.From) || eczaneNobetSonuclarAylik.Select(s => s.EczaneId).Distinct().Contains(w.To)))
                                  .ToList();

            //sonuclarda ilişkili eczaneler
            var eczaneGruplar = _eczaneGrupService.GetDetaylar(nobetUstGrupId)
                                .Where(x => x.EczaneGrupTanimBitisTarihi == null
                                       //&& x.EczaneGrupTanimTipId == 2 //coğrafi yakınlık hariç
                                       && nobetGrupIdListe.Contains(x.NobetGrupId) &&
                                       (eczaneGrupEdges.Select(s => s.From).Distinct().Contains(x.EczaneId) || eczaneGrupEdges.Select(s => s.To).Distinct().Contains(x.EczaneId))
                                       ).ToList();

            //fazladan gelen tanımlar var. burayı iyileştirmekte fayda var
            var eczaneGrupTanimlar = _eczaneGrupTanimService.GetAktifTanimList(eczaneGruplar.Select(x => x.EczaneGrupTanimId).ToList());
            var eczaneGruplar2     = _eczaneGrupService.GetDetaylarByEczaneGrupTanimId(eczaneGrupTanimlar.Select(s => s.Id).ToList());

            var eczaneGrupNobetSonuclar = eczaneNobetSonuclarAylik
                                          .Where(w => eczaneGruplar2.Select(s => s.EczaneId).Contains(w.EczaneId)).ToList();

            var esGrupluEczaneler = _eczaneNobetGrupService.GetAktifEczaneGrupList(nobetGrupIdListe)
                                    .Where(x => !eczaneNobetMazeretNobettenDusenler.Select(s => s.EczaneId).Contains(x.EczaneId))
                                    .Select(x => x.EczaneId).Distinct().ToList();

            var eczaneNobetGruplar = _eczaneNobetGrupService.GetAktifEczaneGrupList(nobetGruplar.Select(w => w.Id).ToList())
                                     .Where(s => !eczaneNobetMazeretNobettenDusenler.Select(f => f.EczaneId).Contains(s.EczaneId)).ToList();

            #region aynı gün nöbet tutan eczaneler

            //nöbet yazılacak tarih aralığı(örn. Ocak ayının tüm günleri)
            //int cozumOncekiAyi = GetOncekiAy(periyot: 3, cozumAyi: ayBitis);
            //var cozumOncekiIkiAyi = GetOncekiAy(periyot: 2, cozumAyi: ayBitis);
            //var aktifSonuclar = _eczaneNobetSonucAktifService.GetSonuclarAylik(yilBitis, ayBitis, nobetUstGrupId);
            //var ayniAydakiDigerGruplarinSonuclari = _eczaneNobetSonucService.GetSonuclarAylik(yilBitis, ayBitis, nobetUstGrupId);
            //var ayIcindekiTumSonuclar = aktifSonuclar.Union(ayniAydakiDigerGruplarinSonuclari).ToList();
            //var ayIcindeCozulenNobetGruplar = ayIcindekiTumSonuclar.Select(s => s.NobetGrupId).Distinct().ToList();

            #region son iki ay

            //var sonIkiAyBakilacakGruplar = new List<int>();

            //foreach (var item in ayIcindeCozulenNobetGruplar)
            //{
            //    sonIkiAyBakilacakGruplar.Add(item);
            //}

            ////şimdi çözülecek grup
            //foreach (var item in nobetGrupIdListe)
            //{
            //    sonIkiAyBakilacakGruplar.Add(item);
            //}

            //var sonIkiAyAyniGunNobetTutanEczaneler = new List<EczaneCiftGrup>();
            //var gruplar = sonIkiAyBakilacakGruplar.Distinct().ToList();

            //if (_nobetUstGrupKisitService.GetKisitPasifMi("sonIkiAydakiGrup", nobetUstGrupId) && sonIkiAyBakilacakGruplar.Count() > 1 && ayBitis > 1)
            //{
            //    var sonIkiAydakiSonuclar = _eczaneNobetSonucService.GetSonuclar(yilBitis, cozumOncekiAyi, ayBitis - 1, nobetUstGrupId)
            //     .Where(x => gruplar.Contains(x.NobetGrupId)).ToList();

            //    sonIkiAyAyniGunNobetTutanEczaneler = _eczaneNobetOrtakService.GetCiftGrupluEczaneler(sonIkiAydakiSonuclar, 1);
            //}
            #endregion

            #region yillik kümülatif

            //var yilIcindeAyniGunNobetTutanEczaneler = new List<EczaneCiftGrup>();

            //if (_nobetUstGrupKisitService.GetKisitPasifMi("yildaEncokUcKezGrup", nobetUstGrupId) && sonIkiAyBakilacakGruplar.Count() > 1 && ayBitis > 2)
            //{
            //    var yillikKumulatifSonuclar = _eczaneNobetSonucService.GetSonuclarYillikKumulatif(yilBitis, ayBitis - 1, nobetUstGrupId)
            //        .Where(x => gruplar.Contains(x.NobetGrupId)).ToList();

            //    yilIcindeAyniGunNobetTutanEczaneler = _eczaneNobetOrtakService.GetCiftGrupluEczaneler(yillikKumulatifSonuclar, 3);
            //}
            #endregion

            //bu alan EczaneNobetCozAktifiGuncelle içinde kullanılıyor.
            var ayIcindeAyniGunNobetTutanEczaneler = new List <EczaneCiftGrup>();

            #endregion

            var alanyaDataModel = new AlanyaDataModelEski()
            {
                Yil                     = yilBitis,
                Ay                      = ayBitis,
                LowerBound              = 0,
                UpperBound              = 1,
                NobetUstGrupId          = nobetUstGrupId,
                NobetGruplar            = nobetGruplar,
                EczaneNobetTarihAralik  = _takvimService.GetEczaneNobetTarihAralik(baslangicTarihi, bitisTarihi, nobetGorevTipId, nobetGrupIdListe), //karar değişkeni
                EczaneKumulatifHedefler = _takvimService.GetEczaneKumulatifHedefler(yilBaslangic, yilBitis, ayBaslangic, ayBitis, nobetGrupIdListe, nobetGorevTipId),
                EczaneNobetMazeretListe = _eczaneNobetMazeretService.GetDetaylar(yilBitis, ayBitis, esGrupluEczaneler),
                EczaneGrupTanimlar      = eczaneGrupTanimlar,
                TarihAraligi            = _takvimService.GetTakvimNobetGruplar(baslangicTarihi, bitisTarihi, nobetGrupIdListe, nobetGorevTipId),
                EczaneGruplar           = eczaneGruplar2,
                EczaneNobetIstekListe   = _eczaneNobetIstekService.GetDetaylarByNobetGrupIdList(yilBitis, ayBitis, nobetGrupIdListe),
                NobetGrupGunKurallar    = _nobetGrupGunKuralService.GetAktifList(nobetGrupIdListe),
                NobetGrupKurallar       = _nobetGrupKuralService.GetDetaylar(nobetGrupIdListe),
                NobetGrupGorevTipler    = _nobetGrupGorevTipService.GetList(nobetGorevTipId, nobetGrupIdListe),
                NobetGrupTalepler       = _nobetGrupTalepService.GetDetaylar(nobetGrupIdListe, baslangicTarihi, bitisTarihi),
                EczaneNobetGruplar      = eczaneNobetGruplar,
                NobetUstGrupKisitlar    = _nobetUstGrupKisitService.GetDetaylar(nobetUstGrupId),
                EczaneGrupNobetSonuclar = eczaneGrupNobetSonuclar,
                EczaneNobetSonuclar     = _eczaneNobetSonucService.GetSonuclar(nobetUstGrupId),

                AyIcindeAyniGunNobetTutanEczaneler  = ayIcindeAyniGunNobetTutanEczaneler,
                YilIcindeAyniGunNobetTutanEczaneler = new List <EczaneCiftGrup>(),        //yilIcindeAyniGunNobetTutanEczaneler,
                SonIkiAyAyniGunNobetTutanEczaneler  = new List <EczaneCiftGrup>(),        //sonIkiAyAyniGunNobetTutanEczaneler,
                EczaneNobetSonuclarSonIkiAy         = new List <EczaneNobetSonucListe>(), //_eczaneNobetSonucService.GetSonuclar(yilBitis, cozumOncekiIkiAyi, ayBitis, nobetUstGrupId),
                EczaneNobetSonuclarOncekiAylar      = new List <EczaneNobetSonucListe>()  //_eczaneNobetSonucService.GetSonuclar(yilBitis, ayBaslangic, ayBitis, nobetUstGrupId)
            };
            return(alanyaDataModel);
        }
예제 #7
0
        private ZonguldakDataModel EczaneNobetDataModel(EczaneNobetDataModelParametre eczaneNobetDataModelParametre)
        {
            #region parametreler
            var nobetUstGrupId = eczaneNobetDataModelParametre.NobetUstGrupId;
            //var nobetGrupIdListe = eczaneNobetDataModelParametre.NobetGrupId.ToList();
            //var nobetGorevTipId = eczaneNobetDataModelParametre.NobetGorevTipId;
            var nobetUstGrupBaslangicTarihi = eczaneNobetDataModelParametre.NobetUstGrupBaslangicTarihi;
            var baslangicTarihi             = eczaneNobetDataModelParametre.BaslangicTarihi;
            var bitisTarihi = eczaneNobetDataModelParametre.BitisTarihi;
            var nobetGrupGorevTiplerTumu = eczaneNobetDataModelParametre.NobetGrupGorevTipler;//.Where(w => nobetGrupIdListe.Contains(w.NobetGrupId)).ToList();
            var nobetGorevTipler         = eczaneNobetDataModelParametre.NobetGrupGorevTipler.Select(s => s.NobetGorevTipId).Distinct().ToList();
            #endregion

            var nobetGrupIdListe = eczaneNobetDataModelParametre.NobetGrupGorevTipler.Select(s => s.NobetGrupId).ToList();

            foreach (var nobetGrupGorevTip in nobetGrupGorevTiplerTumu)
            {
                if (baslangicTarihi < nobetGrupGorevTip.BaslamaTarihi)
                {
                    throw new Exception($"Nöbet başlangıç tarihi <strong>({baslangicTarihi.ToShortDateString()})</strong> grup başlama tarihinden <strong>({nobetGrupGorevTip.BaslamaTarihi.ToShortDateString()})</strong> küçük olamaz.");
                }
            }

            var debugYapilacakEczaneler = _debugEczaneService.GetDetaylarAktifOlanlar(nobetUstGrupId);

            var sadeceSiraliNobetYazilacakGruplar = _nobetGrupGorevTipKisitService.GetDetaylarByKisitId(63);//Sadece Sıralı Nöbet Yaz

            var nobetGrupGorevTipler = new List <NobetGrupGorevTipDetay>();
            var nobetGrupGorevTiplerSiradanYazilacaklar = new List <NobetGrupGorevTipDetay>();

            //algoritma ile nöbet yazılacak gruplar
            if (sadeceSiraliNobetYazilacakGruplar.Count > 0)
            {
                nobetGrupGorevTipler = nobetGrupGorevTiplerTumu
                                       .Where(w => !sadeceSiraliNobetYazilacakGruplar.Select(s => s.NobetGrupGorevTipId).Contains(w.Id)).ToList();

                nobetGrupGorevTiplerSiradanYazilacaklar = nobetGrupGorevTiplerTumu
                                                          .Where(w => sadeceSiraliNobetYazilacakGruplar.Select(s => s.NobetGrupGorevTipId).Contains(w.Id)).ToList();
            }

            //var nobetGruplar = _nobetGrupService.GetDetaylar(nobetGrupIdListe).OrderBy(s => s.Id).ToList();
            //var nobetGrupGorevTipler = _nobetGrupGorevTipService.GetDetaylar(nobetGrupIdListe); //nobetGorevTipId,
            var eczaneNobetSonuclar = _eczaneNobetSonucService.GetSonuclar(nobetUstGrupId);

            var eczaneNobetMazeretNobettenDusenler = new List <EczaneNobetMazeretSayilari>();

            var mazeret = _nobetUstGrupKisitService.GetKisitPasifMi("mazeret", nobetUstGrupId);

            if (mazeret)
            {
                eczaneNobetMazeretNobettenDusenler = _eczaneNobetMazeretService.GetEczaneNobetMazeretSayilari(baslangicTarihi, bitisTarihi, nobetGrupIdListe);
            }

            var eczaneNobetGruplarTumu = _eczaneNobetGrupService.GetDetaylarByNobetGrupGorevTipler(baslangicTarihi, bitisTarihi, nobetGrupGorevTiplerTumu.Select(s => s.Id).ToList())
                                         .Where(w => !eczaneNobetMazeretNobettenDusenler.Select(s => s.EczaneNobetGrupId).Contains(w.Id)
                                                //&& w.EczaneAdi == "ÖZGÜR"
                                                ).ToList();

            //var nobetGorevTipId = 1;
            //if (!nobetGorevTipler.Contains(nobetGorevTipId))
            //    nobetGorevTipId = 0;

            var eczaneNobetGruplarGorevTip1 = eczaneNobetGruplarTumu;

            //nobetGorevTipId = 2;
            //if (!nobetGorevTipler.Contains(nobetGorevTipId))
            //    nobetGorevTipId = 0;

            //var eczaneNobetGruplarGorevTip2 = eczaneNobetGruplarTumu
            //    .Where(w => w.NobetGorevTipId == nobetGorevTipId).ToList();

            var eczaneNobetSonuclarOncekiAylar = eczaneNobetSonuclar
                                                 .Where(w => w.Tarih >= w.NobetGrupGorevTipBaslamaTarihi &&
                                                        eczaneNobetGruplarTumu.Select(s => s.Id).Contains(w.EczaneNobetGrupId) //görevtip: tümü
                                                                                                                               //&& eczaneNobetGruplarGorevTip1.Select(s => s.Id).Contains(w.EczaneNobetGrupId) //görevtip: 1
                                                        ).ToList();

            var eczaneNobetSonuclarCozulenGruplar = eczaneNobetSonuclar
                                                    .Where(w => eczaneNobetGruplarTumu.Select(s => s.Id).Contains(w.EczaneNobetGrupId)).ToList();

            //var kk = eczaneNobetSonuclarCozulenGruplar
            //    .Where(w => w.EczaneAdi == "TUNA"
            //             && w.Tarih == new DateTime(2013, 1, 1)).ToList();
            var tarihAralik = _takvimService.GetTakvimNobetGruplar(baslangicTarihi, bitisTarihi, nobetGrupGorevTipler);

            var enSonNobetler = _eczaneNobetOrtakService.GetEczaneNobetGrupGunKuralIstatistik(eczaneNobetGruplarTumu, eczaneNobetSonuclarCozulenGruplar);

            var eczaneNobetGrupGunKuralIstatistikYatay = _eczaneNobetOrtakService.GetEczaneNobetGrupGunKuralIstatistikYatay(enSonNobetler);

            //var bak = eczaneNobetGrupGunKuralIstatistikYatay.Where(w => w.NobetGorevTipId == 2).ToList();
            var nobetBorc = _nobetUstGrupKisitService.GetDetay(39, nobetUstGrupId);

            if (!nobetBorc.PasifMi && nobetBorc.KisitId > 0)
            {
                var anahtarListe = eczaneNobetSonuclar
                                   .Where(w => w.Tarih < w.NobetGrupGorevTipBaslamaTarihi &&
                                          nobetGrupIdListe.Contains(w.NobetGrupId)).ToList();

                var borcTakipEdilecekGunGruplar = new int[]
                {
                    //1,
                    //3,
                    4
                };

                var gunGruplar = tarihAralik
                                 .Where(w => borcTakipEdilecekGunGruplar.Contains(w.GunGrupId))
                                 .Select(s => new { s.GunGrupId, s.GunGrupAdi })
                                 .Distinct()
                                 .OrderBy(o => o.GunGrupId).ToList();

                foreach (var gunGrup in gunGruplar)
                {
                    var haftaIciAnahtarListeTumEczaneler = _takvimService.AnahtarListeyiBuGuneTasi(nobetGrupGorevTipler, eczaneNobetGruplarTumu, eczaneNobetGrupGunKuralIstatistikYatay, anahtarListe, gunGrup.GunGrupAdi);

                    var nobetBorcEczaneler = (from s in eczaneNobetGrupGunKuralIstatistikYatay
                                              from b in haftaIciAnahtarListeTumEczaneler
                                              where s.EczaneNobetGrupId == b.EczaneNobetGrupId &&
                                              s.NobetSayisiHaftaIci == b.NobetSayisi
                                              select new EczaneNobetAlacakVerecek
                    {
                        EczaneNobetGrupId = s.EczaneNobetGrupId,
                        EczaneId = s.EczaneId,
                        EczaneAdi = s.EczaneAdi,
                        NobetGrupAdi = s.NobetGrupAdi,
                        NobetGrupId = s.NobetGrupId,
                        NobetSayisi = gunGrup.GunGrupId == 1
                                                      ? s.NobetSayisiPazar
                                                      : gunGrup.GunGrupId == 4
                                                      ? s.NobetSayisiCumartesi
                                                      : s.NobetSayisiHaftaIci,
                        SonNobetTarihi = gunGrup.GunGrupId == 1
                                                      ? s.SonNobetTarihiPazar
                                                      : gunGrup.GunGrupId == 4
                                                      ? s.SonNobetTarihiCumartesi
                                                      : s.SonNobetTarihiHaftaIci,
                        AnahtarTarih = b.Tarih,
                        BorcluGunSayisi = gunGrup.GunGrupId == 1
                                                      ? ((int)(s.NobetSayisiPazar > 0
                                                          ? (s.SonNobetTarihiPazar - b.Tarih).TotalDays
                                                          : (s.SonNobetTarihiPazar - b.Tarih).TotalDays - (s.SonNobetTarihiPazar - b.NobetUstGrupBaslamaTarihi).TotalDays))
                                                      : gunGrup.GunGrupId == 4
                                                      ? ((int)(s.NobetSayisiCumartesi > 0
                                                          ? (s.SonNobetTarihiCumartesi - b.Tarih).TotalDays
                                                          : (s.SonNobetTarihiCumartesi - b.Tarih).TotalDays - (s.SonNobetTarihiCumartesi - b.NobetUstGrupBaslamaTarihi).TotalDays))
                                                      : ((int)(s.NobetSayisiHaftaIci > 0
                                                          ? (s.SonNobetTarihiHaftaIci - b.Tarih).TotalDays
                                                          : (s.SonNobetTarihiHaftaIci - b.Tarih).TotalDays - (s.SonNobetTarihiHaftaIci - b.NobetUstGrupBaslamaTarihi).TotalDays)),
                        GunGrupAdi = gunGrup.GunGrupAdi,
                        GunGrupId = gunGrup.GunGrupId
                    }).ToList();

                    foreach (var eczane in nobetBorcEczaneler)
                    {
                        if (gunGrup.GunGrupId == 1)
                        {
                            //eczaneNobetGrupGunKuralIstatistikYatay
                            //.Where(w => w.EczaneNobetGrupId == eczane.EczaneNobetGrupId)
                            //.FirstOrDefault().bo = (int)eczane.BorcluGunSayisi;
                        }
                        else if (gunGrup.GunGrupId == 3)
                        {
                            eczaneNobetGrupGunKuralIstatistikYatay
                            .Where(w => w.EczaneNobetGrupId == eczane.EczaneNobetGrupId)
                            .FirstOrDefault().BorcluNobetSayisiHaftaIci = (int)eczane.BorcluGunSayisi;
                        }
                        else if (gunGrup.GunGrupId == 4)
                        {
                        }
                    }
                }
            }

            var grupluEczaneNobetSonuclar = _eczaneNobetSonucService.GetSonuclar(baslangicTarihi, bitisTarihi, eczaneNobetSonuclar);

            var eczaneGrupEdges = _eczaneGrupService.GetEdges(nobetUstGrupId)
                                  .Where(e => (nobetGrupIdListe.Contains(e.FromNobetGrupId) ||
                                               nobetGrupIdListe.Contains(e.ToNobetGrupId)))
                                  .Where(w => (grupluEczaneNobetSonuclar.Select(s => s.EczaneId).Distinct().Contains(w.From) ||
                                               grupluEczaneNobetSonuclar.Select(s => s.EczaneId).Distinct().Contains(w.To))
                                         ).ToList();

            //sonuçlarda ilişkili eczaneler
            var eczaneGruplar = _eczaneGrupService.GetDetaylarAktifGruplar(nobetUstGrupId)
                                .Where(x => (eczaneGrupEdges.Select(s => s.From).Distinct().Contains(x.EczaneId) || eczaneGrupEdges.Select(s => s.To).Distinct().Contains(x.EczaneId)) ||
                                       nobetGrupIdListe.Contains(x.NobetGrupId)
                                       ).ToList();

            //fazladan gelen tanımlar var iyileştirmekte fayda var
            var eczaneGrupTanimlar = _eczaneGrupTanimService.GetDetaylarAktifTanimList(eczaneGruplar.Select(x => x.EczaneGrupTanimId).ToList());
            var eczaneGruplar2     = _eczaneGrupService.GetDetaylarByEczaneGrupTanimId(eczaneGrupTanimlar.Select(s => s.Id).ToList());

            var eczaneGrupNobetSonuclar = grupluEczaneNobetSonuclar
                                          .Where(w => eczaneGruplar2.Select(s => s.EczaneId).Contains(w.EczaneId)).ToList();

            //nöbet yazılacak tarih aralığı(örn. Ocak ayının tüm günleri)

            var eczaneKumulatifHedefler  = new List <EczaneNobetIstatistik>();
            var eczaneNobetIstatistikler = new List <EczaneNobetIstatistik>();

            //2.görev tipi için sadece cumartesi olduğu için tüm günler tüm görev tiplerini almaya gerek yok.
            //var eczaneNobetTarihAralik = _takvimService.GetEczaneNobetTarihAralik(baslangicTarihi, bitisTarihi, nobetGrupGorevTipler)
            //    .Where(w => eczaneNobetGruplar.Select(s => s.EczaneId).Contains(w.EczaneId)).ToList();
            var nobetGrupGorevTipGunKurallar = _nobetGrupGorevTipGunKuralService.GetDetaylarAktifList(nobetGrupGorevTipler.Select(s => s.Id).ToList());

            //nobetGorevTipId = 1;
            //var nobetGrupGorevTip1 = nobetGrupGorevTipler.Where(w => w.NobetGorevTipId == nobetGorevTipId).ToList();

            var eczaneNobetTarihAralik1 = _takvimService.GetEczaneNobetTarihAralik(baslangicTarihi, bitisTarihi, nobetGrupGorevTipler)
                                          .Where(w => eczaneNobetGruplarGorevTip1.Select(s => s.Id).Contains(w.EczaneNobetGrupId)).ToList();

            var eczaneNobetTarihAralik = _eczaneNobetOrtakService.AmacFonksiyonuKatsayisiBelirle(eczaneNobetTarihAralik1, eczaneNobetGrupGunKuralIstatistikYatay);

            var eczaneNobetIstekler = _eczaneNobetIstekService.GetDetaylarByNobetGrupIdList(baslangicTarihi, bitisTarihi, nobetGrupIdListe)
                                      .Where(w => eczaneNobetGruplarTumu.Select(s => s.EczaneId).Contains(w.EczaneId)).ToList();

            var eczaneNobetMazeretler = _eczaneNobetMazeretService.GetDetaylarByEczaneIdList(baslangicTarihi, bitisTarihi, eczaneNobetGruplarTumu.Select(s => s.EczaneId).Distinct().ToList())
                                        .Where(w => w.MazeretId != 3)
                                        .ToList();

            var takvimNobetGrupGunDegerIstatistikler = new List <TakvimNobetGrupGunDegerIstatistik>();

            foreach (var nobetGrupGorevTip in nobetGrupGorevTipler)
            {
                var takvimNobetGrupGunDegerIstatistik = _takvimService.GetTakvimNobetGrupGunDegerIstatistikler(nobetGrupGorevTip.BaslamaTarihi, bitisTarihi, nobetGrupGorevTip.Id);

                takvimNobetGrupGunDegerIstatistikler.AddRange(takvimNobetGrupGunDegerIstatistik);
            }

            var eczaneNobetGrupAltGruplar = _eczaneNobetGrupAltGrupService.GetDetaylar(nobetUstGrupId);


            #region önceki aylar aynı gün nöbet tutanlar çözülen ayda aynı gün nöbetçi olmasın

            var oncekiAylardaAyniGunNobetTutanEczaneler = new List <EczaneGrupDetay>();

            var oncekiAylarAyniGunNobet = _nobetUstGrupKisitService.GetDetay("oncekiAylarAyniGunNobet", nobetUstGrupId);

            if (!oncekiAylarAyniGunNobet.PasifMi)
            {
                oncekiAylardaAyniGunNobetTutanEczaneler = _eczaneNobetSonucService.OncekiAylardaAyniGunNobetTutanlar(baslangicTarihi, eczaneNobetSonuclarOncekiAylar, 0, (int)oncekiAylarAyniGunNobet.SagTarafDegeri);
            }

            #endregion

            var ikiliEczaneler = _ayniGunTutulanNobetService.GetDetaylar(nobetGrupIdListe);

            var nobetGrupKurallar = _nobetGrupKuralService.GetDetaylar(nobetGrupIdListe);

            var nobetUstGrupKisitlar = _nobetUstGrupKisitService.GetDetaylar(nobetUstGrupId);
            var grupBazliKisitlar    = _nobetGrupGorevTipKisitService.GetDetaylar(nobetUstGrupId);

            var zonguldakDataModel = new ZonguldakDataModel()
            {
                Yil                         = eczaneNobetDataModelParametre.YilBaslangic,
                Ay                          = eczaneNobetDataModelParametre.AyBitis,
                TimeLimit                   = eczaneNobetDataModelParametre.TimeLimit,
                CalismaSayisiLimit          = eczaneNobetDataModelParametre.CalismaSayisi,
                LowerBound                  = 0,
                UpperBound                  = 1,
                BaslangicTarihi             = baslangicTarihi,
                BitisTarihi                 = bitisTarihi,
                NobetUstGrupBaslangicTarihi = nobetUstGrupBaslangicTarihi,
                NobetUstGrupId              = nobetUstGrupId,
                EczaneNobetTarihAralik      = eczaneNobetTarihAralik,  //karar değişkeni
                EczaneKumulatifHedefler     = eczaneKumulatifHedefler, //.Where(w => w.EczaneId != 121).ToList(),
                EczaneNobetIstatistikler    = eczaneNobetIstatistikler,
                EczaneNobetMazeretler       = eczaneNobetMazeretler,
                EczaneGrupTanimlar          = eczaneGrupTanimlar,
                TarihAraligi                = tarihAralik,
                //NobetGruplar = nobetGruplar,
                EczaneGruplar = eczaneGruplar2,
                AyniGunNobetTutanEsGruplar = new List <EczaneGrupDetay>(), //ayniGunNoetTutanEczaneGruplar,
                OncekiAylardaAyniGunNobetTutanEczaneler = oncekiAylardaAyniGunNobetTutanEczaneler,
                EczaneNobetIstekler          = eczaneNobetIstekler,
                NobetGrupGunKurallar         = _nobetGrupGunKuralService.GetAktifList(nobetGrupIdListe),
                NobetGrupGorevTipGunKurallar = _nobetGrupGorevTipGunKuralService.GetDetaylarAktifList(nobetGrupGorevTipler.Select(s => s.Id).ToList()),
                NobetGrupKurallar            = nobetGrupKurallar,
                NobetGrupGorevTipler         = nobetGrupGorevTipler,
                NobetGrupTalepler            = _nobetGrupTalepService.GetDetaylar(nobetGrupIdListe, baslangicTarihi, bitisTarihi),
                EczaneNobetGruplar           = eczaneNobetGruplarTumu,
                Kisitlar = nobetUstGrupKisitlar,
                EczaneGrupNobetSonuclar                = eczaneGrupNobetSonuclar,
                EczaneNobetSonuclar                    = eczaneNobetSonuclarCozulenGruplar,
                EczaneGrupNobetSonuclarTumu            = eczaneNobetSonuclar,
                EczaneNobetGrupGunKuralIstatistikler   = enSonNobetler,
                TakvimNobetGrupGunDegerIstatistikler   = takvimNobetGrupGunDegerIstatistikler,
                EczaneNobetGrupGunKuralIstatistikYatay = eczaneNobetGrupGunKuralIstatistikYatay,
                EczaneNobetGrupAltGruplar              = eczaneNobetGrupAltGruplar,
                IkiliEczaneler            = ikiliEczaneler,
                NobetGrupGorevTipKisitlar = grupBazliKisitlar,
                DebugYapilacakEczaneler   = debugYapilacakEczaneler
            };

            //_eczaneNobetOrtakService.KurallariKontrolEtHaftaIciEnAzEnCok(nobetUstGrupId, eczaneNobetGrupGunKuralIstatistikYatay);
            _eczaneNobetOrtakService.KurallariKontrolEtMazeretIstek(nobetUstGrupId, eczaneNobetMazeretler, eczaneNobetIstekler);
            _eczaneNobetOrtakService.KurallariKontrolEtIstek(nobetUstGrupId, eczaneNobetIstekler, nobetGrupKurallar);

            return(zonguldakDataModel);
        }
        private OsmaniyeDataModel EczaneNobetDataModel(EczaneNobetDataModelParametre eczaneNobetDataModelParametre)
        {
            #region parametreler
            var nobetUstGrupId   = eczaneNobetDataModelParametre.NobetUstGrupId;
            var nobetGrupIdListe = eczaneNobetDataModelParametre.NobetGrupId.ToList();
            //var nobetGorevTipId = eczaneNobetDataModelParametre.NobetGorevTipId;
            var nobetUstGrupBaslangicTarihi = eczaneNobetDataModelParametre.NobetUstGrupBaslangicTarihi;
            var baslangicTarihi             = eczaneNobetDataModelParametre.BaslangicTarihi;
            var bitisTarihi          = eczaneNobetDataModelParametre.BitisTarihi;
            var nobetGrupGorevTipler = eczaneNobetDataModelParametre.NobetGrupGorevTipler;
            var nobetGorevTipler     = eczaneNobetDataModelParametre.NobetGrupGorevTipler.Select(s => s.NobetGorevTipId).Distinct().ToList();
            #endregion

            if (baslangicTarihi < nobetUstGrupBaslangicTarihi)
            {
                throw new Exception($"Nöbet başlangıç tarihi <strong>({baslangicTarihi.ToShortDateString()})</strong> üst grup başlama tarihinden <strong>({nobetUstGrupBaslangicTarihi.ToShortDateString()})</strong> küçük olamaz.");
            }

            var debugYapilacakEczaneler = _debugEczaneService.GetDetaylarAktifOlanlar(nobetUstGrupId);

            var nobetGruplar = _nobetGrupService.GetDetaylar(nobetGrupIdListe).OrderBy(s => s.Id).ToList();
            //var nobetGrupGorevTipler = _nobetGrupGorevTipService.GetDetaylar(nobetGrupIdListe); //nobetGorevTipId,
            var eczaneNobetSonuclar = _eczaneNobetSonucService.GetSonuclar(nobetUstGrupId);

            var eczaneNobetMazeretNobettenDusenler = new List <EczaneNobetMazeretSayilari>();

            var mazeret = _nobetUstGrupKisitService.GetKisitPasifMi("mazeret", nobetUstGrupId);

            if (mazeret)
            {
                eczaneNobetMazeretNobettenDusenler = _eczaneNobetMazeretService.GetEczaneNobetMazeretSayilari(baslangicTarihi, bitisTarihi, nobetGrupIdListe);
            }

            var eczaneNobetGruplarTumu = _eczaneNobetGrupService.GetDetaylar(nobetGrupIdListe, baslangicTarihi, bitisTarihi)
                                         .Where(w => !eczaneNobetMazeretNobettenDusenler.Select(s => s.EczaneNobetGrupId).Contains(w.Id)
                                                //&& w.EczaneAdi == "ÖZGÜR"
                                                ).ToList();

            var nobetGorevTipId = 1;
            if (!nobetGorevTipler.Contains(nobetGorevTipId))
            {
                nobetGorevTipId = 0;
            }

            var eczaneNobetGruplarGorevTip1 = eczaneNobetGruplarTumu
                                              .Where(w => w.NobetGorevTipId == nobetGorevTipId).ToList();

            nobetGorevTipId = 2;
            if (!nobetGorevTipler.Contains(nobetGorevTipId))
            {
                nobetGorevTipId = 0;
            }

            var eczaneNobetGruplarGorevTip2 = eczaneNobetGruplarTumu
                                              .Where(w => w.NobetGorevTipId == nobetGorevTipId).ToList();

            var eczaneNobetSonuclarOncekiAylar = eczaneNobetSonuclar
                                                 .Where(w => w.Tarih >= nobetUstGrupBaslangicTarihi &&
                                                        eczaneNobetGruplarTumu.Select(s => s.Id).Contains(w.EczaneNobetGrupId) //görevtip: tümü
                                                                                                                               //&& eczaneNobetGruplarGorevTip1.Select(s => s.Id).Contains(w.EczaneNobetGrupId) //görevtip: 1
                                                        ).ToList();

            var eczaneNobetSonuclarCozulenGruplar = eczaneNobetSonuclar
                                                    .Where(w => eczaneNobetGruplarTumu.Select(s => s.Id).Contains(w.EczaneNobetGrupId)).ToList();

            var son3Ay = baslangicTarihi.AddMonths(-2);

            var eczaneNobetSonuclarSon3Ay = eczaneNobetSonuclarCozulenGruplar
                                            .Where(w => w.Tarih >= son3Ay).ToList();

            var sonuclarKontrol = _eczaneNobetSonucService.GetSonuclar(baslangicTarihi, bitisTarihi, eczaneNobetSonuclarCozulenGruplar);

            if (sonuclarKontrol.Count > 0)
            {
                throw new Exception("Kriterlere uygun <strong>daha önce yazılmış nöbetler</strong> bulunmaktadır. Lütfen kontrol ediniz!");
            }

            var enSonNobetler = _eczaneNobetOrtakService.GetEczaneNobetGrupGunKuralIstatistik(eczaneNobetGruplarTumu, eczaneNobetSonuclarCozulenGruplar);

            var enSonNobetlerSon3Ay = _eczaneNobetOrtakService.GetEczaneNobetGrupGunKuralIstatistik(eczaneNobetGruplarTumu, eczaneNobetSonuclarSon3Ay);

            var eczaneNobetGrupGunKuralIstatistikYatay = _eczaneNobetOrtakService.GetEczaneNobetGrupGunKuralIstatistikYatay(enSonNobetler);

            var eczaneNobetGrupGunKuralIstatistikYataySon3Ay = _eczaneNobetOrtakService.GetEczaneNobetGrupGunKuralIstatistikYatay(enSonNobetlerSon3Ay);

            //var bak = eczaneNobetGrupGunKuralIstatistikYatay.Where(w => w.NobetGorevTipId == 2).ToList();

            var anahtarListe = eczaneNobetSonuclar
                               .Where(w => w.Tarih < nobetUstGrupBaslangicTarihi && nobetGrupIdListe.Contains(w.NobetGrupId)).ToList();

            //var haftaIciAnahtarListeTumEczaneler = _takvimService.AnahtarListeyiBuGuneTasi(nobetGrupIdListe, 1, nobetUstGrupBaslangicTarihi, eczaneNobetGruplarTumu, eczaneNobetGrupGunKuralIstatistikYatay, anahtarListe, "Hafta İçi");
            var haftaIciAnahtarListeTumEczaneler = _takvimService.AnahtarListeyiBuGuneTasi(nobetGrupIdListe, nobetGorevTipId, nobetUstGrupBaslangicTarihi, eczaneNobetGruplarTumu, eczaneNobetGrupGunKuralIstatistikYatay, anahtarListe, "Hafta İçi");

            var nobetBorcluEczanelerhaftaIci = (from s in eczaneNobetGrupGunKuralIstatistikYatay
                                                from b in haftaIciAnahtarListeTumEczaneler
                                                where s.EczaneNobetGrupId == b.EczaneNobetGrupId &&
                                                s.NobetSayisiHaftaIci == b.NobetSayisi
                                                select new EczaneNobetAlacakVerecek
            {
                EczaneNobetGrupId = s.EczaneNobetGrupId,
                EczaneId = s.EczaneId,
                EczaneAdi = s.EczaneAdi,
                NobetGrupAdi = s.NobetGrupAdi,
                NobetGrupId = s.NobetGrupId,
                NobetSayisi = s.NobetSayisiHaftaIci,
                SonNobetTarihi = s.SonNobetTarihiHaftaIci,
                AnahtarTarih = b.Tarih,
                BorcluGunSayisi = (int)(s.NobetSayisiHaftaIci > 0
                                                            ? (s.SonNobetTarihiHaftaIci - b.Tarih).TotalDays
                                                            : (s.SonNobetTarihiHaftaIci - b.Tarih).TotalDays - (s.SonNobetTarihiHaftaIci - b.NobetUstGrupBaslamaTarihi).TotalDays),
                GunGrupAdi = "Hafta İçi"
            }).ToList();

            foreach (var eczane in nobetBorcluEczanelerhaftaIci)
            {
                eczaneNobetGrupGunKuralIstatistikYatay
                .Where(w => w.EczaneNobetGrupId == eczane.EczaneNobetGrupId)
                .FirstOrDefault().BorcluNobetSayisiHaftaIci = (int)eczane.BorcluGunSayisi;
            }

            var grupluEczaneNobetSonuclar = _eczaneNobetSonucService.GetSonuclar(baslangicTarihi, bitisTarihi, eczaneNobetSonuclar);

            var eczaneGrupEdges = _eczaneGrupService.GetEdges(nobetUstGrupId)
                                  .Where(e => (nobetGrupIdListe.Contains(e.FromNobetGrupId) ||
                                               nobetGrupIdListe.Contains(e.ToNobetGrupId)))
                                  .Where(w => (grupluEczaneNobetSonuclar.Select(s => s.EczaneId).Distinct().Contains(w.From) ||
                                               grupluEczaneNobetSonuclar.Select(s => s.EczaneId).Distinct().Contains(w.To))
                                         ).ToList();

            //sonuçlarda ilişkili eczaneler
            var eczaneGruplar = _eczaneGrupService.GetDetaylarAktifGruplar(nobetUstGrupId)
                                .Where(x => (eczaneGrupEdges.Select(s => s.From).Distinct().Contains(x.EczaneId) || eczaneGrupEdges.Select(s => s.To).Distinct().Contains(x.EczaneId)) ||
                                       nobetGrupIdListe.Contains(x.NobetGrupId)
                                       ).ToList();

            //fazladan gelen tanımlar var iyileştirmekte fayda var
            var eczaneGrupTanimlar = _eczaneGrupTanimService.GetDetaylarAktifTanimList(eczaneGruplar.Select(x => x.EczaneGrupTanimId).ToList());
            var eczaneGruplar2     = _eczaneGrupService.GetDetaylarByEczaneGrupTanimId(eczaneGrupTanimlar.Select(s => s.Id).ToList());

            var eczaneGrupNobetSonuclar = grupluEczaneNobetSonuclar
                                          .Where(w => eczaneGruplar2.Select(s => s.EczaneId).Contains(w.EczaneId)).ToList();

            //nöbet yazılacak tarih aralığı(örn. Ocak ayının tüm günleri)
            var tarihAralik = _takvimService.GetTakvimNobetGruplar(baslangicTarihi, bitisTarihi, nobetGrupGorevTipler);

            var eczaneKumulatifHedefler  = new List <EczaneNobetIstatistik>();
            var eczaneNobetIstatistikler = new List <EczaneNobetIstatistik>();

            //2.görev tipi için sadece cumartesi olduğu için tüm günler tüm görev tiplerini almaya gerek yok.
            //var eczaneNobetTarihAralik = _takvimService.GetEczaneNobetTarihAralik(baslangicTarihi, bitisTarihi, nobetGrupGorevTipler)
            //    .Where(w => eczaneNobetGruplar.Select(s => s.EczaneId).Contains(w.EczaneId)).ToList();
            var nobetGrupGorevTipGunKurallar = _nobetGrupGorevTipGunKuralService.GetDetaylarAktifList(nobetGrupGorevTipler.Select(s => s.Id).ToList());

            nobetGorevTipId = 1;
            var nobetGrupGorevTip1 = nobetGrupGorevTipler.Where(w => w.NobetGorevTipId == nobetGorevTipId).ToList();

            var eczaneNobetTarihAralik1 = _takvimService.GetEczaneNobetTarihAralik(baslangicTarihi, bitisTarihi, nobetGrupGorevTip1)
                                          .Where(w => eczaneNobetGruplarGorevTip1.Select(s => s.Id).Contains(w.EczaneNobetGrupId)).ToList();

            //nobetGorevTipId = 2;
            //var nobetGrupGorevTip2 = nobetGrupGorevTipler.Where(w => w.NobetGorevTipId == nobetGorevTipId).ToList();
            //var noberGunKurallar = nobetGrupGorevTipGunKurallar.Where(w => nobetGrupGorevTip2.Select(s => s.Id).Contains(w.NobetGrupGorevTipId)).Select(s => s.NobetGunKuralId).ToList();

            //var eczaneNobetTarihAralik2 = _takvimService.GetEczaneNobetTarihAralik(baslangicTarihi, bitisTarihi, nobetGrupGorevTip2, noberGunKurallar)
            //    .Where(w => eczaneNobetGruplarGorevTip2.Select(s => s.Id).Contains(w.EczaneNobetGrupId)).ToList();

            var eczaneNobetTarihAralik = _eczaneNobetOrtakService.AmacFonksiyonuKatsayisiBelirle(eczaneNobetTarihAralik1, eczaneNobetGrupGunKuralIstatistikYatay);

            //.Union(eczaneNobetTarihAralik2).ToList();

            var eczaneNobetIstekler = _eczaneNobetIstekService.GetDetaylarByNobetGrupIdList(baslangicTarihi, bitisTarihi, nobetGrupIdListe)
                                      .Where(w => eczaneNobetGruplarTumu.Select(s => s.EczaneId).Contains(w.EczaneId)).ToList();

            var eczaneNobetMazeretler = _eczaneNobetMazeretService.GetDetaylarByEczaneIdList(baslangicTarihi, bitisTarihi, eczaneNobetGruplarTumu.Select(s => s.EczaneId).Distinct().ToList())
                                        .Where(w => w.MazeretId != 3)
                                        .ToList();

            var takvimNobetGrupGunDegerIstatistikler = _takvimService.GetTakvimNobetGrupGunDegerIstatistikler(nobetUstGrupBaslangicTarihi, bitisTarihi, nobetGrupGorevTipler);

            var eczaneNobetGrupAltGruplar = _eczaneNobetGrupAltGrupService.GetDetaylar(nobetUstGrupId);

            #region önceki aylar aynı gün nöbet tutanlar çözülen ayda aynı gün nöbetçi olmasın

            var oncekiAylardaAyniGunNobetTutanEczaneler = new List <EczaneGrupDetay>();

            var oncekiAylarAyniGunNobet = _nobetUstGrupKisitService.GetDetay("oncekiAylarAyniGunNobet", nobetUstGrupId);

            if (!oncekiAylarAyniGunNobet.PasifMi)
            {
                oncekiAylardaAyniGunNobetTutanEczaneler = _eczaneNobetSonucService.OncekiAylardaAyniGunNobetTutanlar(baslangicTarihi, eczaneNobetSonuclarOncekiAylar, 0, (int)oncekiAylarAyniGunNobet.SagTarafDegeri);
            }

            #endregion

            var ikiliEczaneler    = _ayniGunTutulanNobetService.GetDetaylar(nobetGrupIdListe);
            var nobetGrupKurallar = _nobetGrupKuralService.GetDetaylarByNobetGrupGorevTipIdList(nobetGrupGorevTipler.Select(s => s.Id).ToList());

            var dataModel = new OsmaniyeDataModel()
            {
                Yil                                          = eczaneNobetDataModelParametre.YilBaslangic,
                Ay                                           = eczaneNobetDataModelParametre.AyBitis,
                TimeLimit                                    = eczaneNobetDataModelParametre.TimeLimit,
                CalismaSayisiLimit                           = eczaneNobetDataModelParametre.CalismaSayisi,
                LowerBound                                   = 0,
                UpperBound                                   = 1,
                BaslangicTarihi                              = baslangicTarihi,
                BitisTarihi                                  = bitisTarihi,
                NobetUstGrupBaslangicTarihi                  = nobetUstGrupBaslangicTarihi,
                NobetUstGrupId                               = nobetUstGrupId,
                EczaneNobetTarihAralik                       = eczaneNobetTarihAralik,  //karar değişkeni
                EczaneKumulatifHedefler                      = eczaneKumulatifHedefler, //.Where(w => w.EczaneId != 121).ToList(),
                EczaneNobetIstatistikler                     = eczaneNobetIstatistikler,
                EczaneNobetMazeretler                        = eczaneNobetMazeretler,
                EczaneGrupTanimlar                           = eczaneGrupTanimlar,
                TarihAraligi                                 = tarihAralik,
                NobetGruplar                                 = nobetGruplar,
                EczaneGruplar                                = eczaneGruplar2,
                AyniGunNobetTutanEsGruplar                   = new List <EczaneGrupDetay>(), //ayniGunNoetTutanEczaneGruplar,
                OncekiAylardaAyniGunNobetTutanEczaneler      = oncekiAylardaAyniGunNobetTutanEczaneler,
                EczaneNobetIstekler                          = eczaneNobetIstekler,
                NobetGrupGunKurallar                         = _nobetGrupGunKuralService.GetAktifList(nobetGrupIdListe),
                NobetGrupGorevTipGunKurallar                 = _nobetGrupGorevTipGunKuralService.GetDetaylarAktifList(nobetGrupGorevTipler.Select(s => s.Id).ToList()),
                NobetGrupKurallar                            = nobetGrupKurallar,
                NobetGrupGorevTipler                         = nobetGrupGorevTipler,
                NobetGrupTalepler                            = _nobetGrupTalepService.GetDetaylar(nobetGrupIdListe, baslangicTarihi, bitisTarihi),
                EczaneNobetGruplar                           = eczaneNobetGruplarTumu,
                NobetUstGrupKisitlar                         = _nobetUstGrupKisitService.GetDetaylar(nobetUstGrupId),
                EczaneGrupNobetSonuclar                      = eczaneGrupNobetSonuclar,
                EczaneNobetSonuclar                          = eczaneNobetSonuclarCozulenGruplar,
                EczaneGrupNobetSonuclarTumu                  = eczaneNobetSonuclar,
                EczaneNobetGrupGunKuralIstatistikler         = enSonNobetler,
                TakvimNobetGrupGunDegerIstatistikler         = takvimNobetGrupGunDegerIstatistikler,
                EczaneNobetGrupGunKuralIstatistikYatay       = eczaneNobetGrupGunKuralIstatistikYatay,
                EczaneNobetGrupGunKuralIstatistikYataySon3Ay = eczaneNobetGrupGunKuralIstatistikYataySon3Ay,
                EczaneNobetGrupAltGruplar                    = eczaneNobetGrupAltGruplar,
                Kalibrasyonlar                               = _kalibrasyonService.GetKalibrasyonlarYatay(nobetUstGrupId),
                IkiliEczaneler                               = ikiliEczaneler,
                NobetDurumlar                                = _nobetDurumService.GetDetaylar(nobetUstGrupId),
                DebugYapilacakEczaneler                      = debugYapilacakEczaneler
            };

            //_eczaneNobetOrtakService.KurallariKontrolEtHaftaIciEnAzEnCok(nobetUstGrupId, eczaneNobetGrupGunKuralIstatistikYatay);
            _eczaneNobetOrtakService.KurallariKontrolEtMazeretIstek(nobetUstGrupId, eczaneNobetMazeretler, eczaneNobetIstekler);
            _eczaneNobetOrtakService.KurallariKontrolEtIstek(nobetUstGrupId, eczaneNobetIstekler, nobetGrupKurallar);

            return(dataModel);
        }
예제 #9
0
        private MersinMerkezDataModelV2 EczaneNobetDataModel(EczaneNobetDataModelParametre eczaneNobetDataModelParametre)
        {
            #region parametreler
            var nobetUstGrupId              = eczaneNobetDataModelParametre.NobetUstGrupId;
            var yilBaslangic                = eczaneNobetDataModelParametre.YilBaslangic;
            var yilBitis                    = eczaneNobetDataModelParametre.YilBitis;
            var ayBaslangic                 = eczaneNobetDataModelParametre.AyBaslangic;
            var ayBitis                     = eczaneNobetDataModelParametre.AyBitis;
            var nobetGrupIdListe            = eczaneNobetDataModelParametre.NobetGrupId.ToList();
            var nobetGorevTipId             = eczaneNobetDataModelParametre.NobetGorevTipId;
            var nobetUstGrupBaslangicTarihi = eczaneNobetDataModelParametre.NobetUstGrupBaslangicTarihi;
            var ayBitisBaslangicGunu        = eczaneNobetDataModelParametre.AyBitisBaslangicGunu;
            var ayBitisBitisGunu            = eczaneNobetDataModelParametre.AyBitisBitisGunu;

            var baslangicTarihi = eczaneNobetDataModelParametre.BaslangicTarihi;
            var bitisTarihi     = eczaneNobetDataModelParametre.BitisTarihi;
            #endregion

            #region başlangıç bitiş tarihleri
            //int aydakiGunSayisi = DateTime.DaysInMonth(yilBitis, ayBitis);
            //var baslangicTarihi = new DateTime(yilBitis, ayBitis, 1);
            //var bitisTarihi = new DateTime(yilBitis, ayBitis, aydakiGunSayisi);

            //if (!eczaneNobetDataModelParametre.BuAyVeSonrasi)
            //{
            //    if (ayBitisBaslangicGunu > 1)
            //    {
            //        baslangicTarihi = new DateTime(yilBitis, ayBitis, ayBitisBaslangicGunu);
            //    }

            //    if (ayBitisBitisGunu < aydakiGunSayisi)
            //    {
            //        bitisTarihi = new DateTime(yilBitis, ayBitis, ayBitisBitisGunu);
            //    }
            //}
            //özel tarih aralığı
            //baslangicTarihi = new DateTime(yilBitis, 4, 16);
            //bitisTarihi = new DateTime(yilBitis, 7, 8);
            #endregion

            var nobetGruplar         = _nobetGrupService.GetDetaylar(nobetGrupIdListe).OrderBy(s => s.Id).ToList();
            var nobetGrupGorevTipler = _nobetGrupGorevTipService.GetDetaylar(nobetGorevTipId, nobetGrupIdListe);
            var eczaneNobetSonuclar  = _eczaneNobetSonucService.GetSonuclar(nobetUstGrupId); //nobetGrupIdListe
            //.Where(w => !(w.EczaneNobetGrupId == 301 && w.TakvimId == 88)).ToList();
            //.Where(w => w.Tarih.Year > 2017).ToList();

            var eczaneNobetMazeretNobettenDusenler = _eczaneNobetMazeretService.GetEczaneNobetMazeretSayilari(baslangicTarihi, bitisTarihi, nobetGrupIdListe);

            var eczaneNobetGruplar = _eczaneNobetGrupService.GetDetaylar(nobetGrupIdListe, baslangicTarihi, bitisTarihi)
                                     .Where(w => !eczaneNobetMazeretNobettenDusenler.Select(s => s.EczaneNobetGrupId).Contains(w.Id)).ToList();

            var eczaneNobetSonuclarCozulenGrup = eczaneNobetSonuclar
                                                 .Where(w => !eczaneNobetMazeretNobettenDusenler.Select(s => s.EczaneNobetGrupId).Contains(w.EczaneNobetGrupId) &&
                                                        nobetGrupIdListe.Contains(w.NobetGrupId)).ToList();

            var enSonNobetler = _eczaneNobetOrtakService.GetEczaneNobetGrupGunKuralIstatistik(eczaneNobetGruplar, eczaneNobetSonuclarCozulenGrup);

            var eczaneNobetGrupGunKuralIstatistikYatay = _eczaneNobetOrtakService.GetEczaneNobetGrupGunKuralIstatistikYatay(enSonNobetler);

            var grupluEczaneNobetSonuclar = eczaneNobetSonuclar
                                            .Where(w => (w.Tarih >= baslangicTarihi && w.Tarih <= bitisTarihi)).ToList();

            var eczaneGrupEdges = _eczaneGrupService.GetEdges()
                                  .Where(e => (nobetGrupIdListe.Contains(e.FromNobetGrupId) ||
                                               nobetGrupIdListe.Contains(e.ToNobetGrupId)))
                                  .Where(w => (grupluEczaneNobetSonuclar.Select(s => s.EczaneId).Distinct().Contains(w.From) ||
                                               grupluEczaneNobetSonuclar.Select(s => s.EczaneId).Distinct().Contains(w.To))
                                         ).ToList();

            //sonuçlarda ilişkili eczaneler
            var eczaneGruplar = _eczaneGrupService.GetDetaylarAktifGruplar(nobetUstGrupId)
                                .Where(x => (eczaneGrupEdges.Select(s => s.From).Distinct().Contains(x.EczaneId) || eczaneGrupEdges.Select(s => s.To).Distinct().Contains(x.EczaneId)) ||
                                       nobetGrupIdListe.Contains(x.NobetGrupId)
                                       ).ToList();

            //fazladan gelen tanımlar var iyileştirmekte fayda var
            var eczaneGrupTanimlar = _eczaneGrupTanimService.GetDetaylarAktifTanimList(eczaneGruplar.Select(x => x.EczaneGrupTanimId).ToList());
            var eczaneGruplar2     = _eczaneGrupService.GetDetaylarByEczaneGrupTanimId(eczaneGrupTanimlar.Select(s => s.Id).ToList());

            var eczaneGrupNobetSonuclar = grupluEczaneNobetSonuclar
                                          .Where(w => eczaneGruplar2.Select(s => s.EczaneId).Contains(w.EczaneId)).ToList();

            //nöbet yazılacak tarih aralığı(örn. Ocak ayının tüm günleri)
            var tarihAralik = _takvimService.GetTakvimNobetGruplar(baslangicTarihi, bitisTarihi, nobetGrupIdListe, nobetGorevTipId);

            //var tarihAralikAltGrupluGruplar = _takvimService.GetTakvimNobetGrupAltGruplar(baslangicTarihi, bitisTarihi, nobetGrupIdListe, nobetGorevTipId);

            var eczaneKumulatifHedefler = new List <EczaneNobetIstatistik>();
            //_takvimService.GetEczaneKumulatifHedefler(yilBaslangic, yilBitis, ayBaslangic, ayBitis, nobetGrupIdListe, nobetGorevTipId)
            //.Where(w => eczaneNobetGruplar.Select(s => s.EczaneId).Contains(w.EczaneId)).ToList();

            var eczaneNobetIstatistikler = new List <EczaneNobetIstatistik>();
            //_eczaneNobetSonucService.GetEczaneNobetIstatistik2(nobetGrupIdListe)
            //.Where(w => eczaneNobetGruplar.Select(s => s.EczaneId).Contains(w.EczaneId)).ToList();

            var eczaneNobetTarihAralik = _takvimService.GetEczaneNobetTarihAralik(baslangicTarihi, bitisTarihi, nobetGorevTipId, nobetGrupIdListe)
                                         .Where(w => eczaneNobetGruplar.Select(s => s.EczaneId).Contains(w.EczaneId)).ToList();

            //2. karar değişkeni. her eczane ve ilgili altgrup
            var eczaneNobetAltGrupTarihAralik = _takvimService.GetEczaneNobetAltGrupTarihAralik(baslangicTarihi, bitisTarihi, nobetGorevTipId, nobetGrupIdListe)
                                                .Where(w => eczaneNobetGruplar.Select(s => s.EczaneId).Contains(w.EczaneId)).ToList();

            var eczaneNobetIstekler = _eczaneNobetIstekService.GetDetaylarByNobetGrupIdList(baslangicTarihi, bitisTarihi.AddDays(10), nobetGrupIdListe)
                                      .Where(w => eczaneNobetGruplar.Select(s => s.EczaneId).Contains(w.EczaneId)).ToList();

            var eczaneNobetMazeretler = _eczaneNobetMazeretService.GetDetaylarByEczaneIdList(baslangicTarihi, bitisTarihi, eczaneNobetGruplar.Select(s => s.EczaneId).Distinct().ToList())
                                        .Where(w => w.MazeretId != 3)
                                        .ToList();

            var takvimNobetGrupGunDegerIstatistikler = _takvimService.GetTakvimNobetGrupGunDegerIstatistikler(nobetUstGrupBaslangicTarihi, bitisTarihi, nobetGrupIdListe, nobetGorevTipId);

            var eczaneNobetGrupAltGruplar = _eczaneNobetGrupAltGrupService.GetDetaylar(nobetUstGrupId);

            var mersinMerkezDataModel = new MersinMerkezDataModelV2()
            {
                Yil        = yilBitis,
                Ay         = ayBitis,
                LowerBound = 0,
                UpperBound = 1,
                NobetUstGrupBaslangicTarihi = nobetUstGrupBaslangicTarihi,
                NobetUstGrupId           = nobetUstGrupId,
                EczaneNobetTarihAralik   = eczaneNobetTarihAralik,  //karar değişkeni
                EczaneKumulatifHedefler  = eczaneKumulatifHedefler, //.Where(w => w.EczaneId != 121).ToList(),
                EczaneNobetIstatistikler = eczaneNobetIstatistikler,
                EczaneNobetMazeretler    = eczaneNobetMazeretler,
                EczaneGrupTanimlar       = eczaneGrupTanimlar,
                TarihAraligi             = tarihAralik,
                NobetGruplar             = nobetGruplar,
                EczaneGruplar            = eczaneGruplar2,
                EczaneNobetIstekler      = eczaneNobetIstekler,
                NobetGrupGunKurallar     = _nobetGrupGunKuralService.GetDetaylarAktifList(nobetGrupIdListe),
                NobetGrupKurallar        = _nobetGrupKuralService.GetDetaylar(nobetGrupIdListe),
                NobetGrupGorevTipler     = nobetGrupGorevTipler,
                NobetGrupTalepler        = _nobetGrupTalepService.GetDetaylar(nobetGrupIdListe, baslangicTarihi, bitisTarihi),
                EczaneNobetGruplar       = eczaneNobetGruplar,
                Kisitlar = _nobetUstGrupKisitService.GetDetaylar(nobetUstGrupId),
                EczaneGrupNobetSonuclar                = eczaneGrupNobetSonuclar,
                EczaneNobetSonuclar                    = eczaneNobetSonuclarCozulenGrup,
                EczaneGrupNobetSonuclarTumu            = eczaneNobetSonuclar,
                EczaneNobetGrupGunKuralIstatistikler   = enSonNobetler,
                TakvimNobetGrupGunDegerIstatistikler   = takvimNobetGrupGunDegerIstatistikler,
                EczaneNobetGrupGunKuralIstatistikYatay = eczaneNobetGrupGunKuralIstatistikYatay,
                EczaneNobetGrupAltGruplar              = eczaneNobetGrupAltGruplar,
                EczaneNobetAltGrupTarihAralik          = eczaneNobetAltGrupTarihAralik
            };

            return(mersinMerkezDataModel);
        }
예제 #10
0
        private MersinMerkezDataModel EczaneNobetDataModel(EczaneNobetDataModelParametre eczaneNobetDataModelParametre)
        {
            #region parametreler
            var nobetUstGrupId              = eczaneNobetDataModelParametre.NobetUstGrupId;
            var yilBaslangic                = eczaneNobetDataModelParametre.YilBaslangic;
            var yilBitis                    = eczaneNobetDataModelParametre.YilBitis;
            var ayBaslangic                 = eczaneNobetDataModelParametre.AyBaslangic;
            var ayBitis                     = eczaneNobetDataModelParametre.AyBitis;
            var nobetGrupIdListe            = eczaneNobetDataModelParametre.NobetGrupId.ToList();
            var nobetGorevTipId             = eczaneNobetDataModelParametre.NobetGorevTipId;
            var nobetUstGrupBaslangicTarihi = eczaneNobetDataModelParametre.NobetUstGrupBaslangicTarihi;
            #endregion

            int aydakiGunSayisi = DateTime.DaysInMonth(yilBitis, ayBitis);
            var baslangicTarihi = new DateTime(yilBitis, ayBitis, 1);
            var bitisTarihi     = new DateTime(yilBitis, ayBitis, aydakiGunSayisi);

            var nobetGruplar         = _nobetGrupService.GetList(nobetGrupIdListe).OrderBy(s => s.Id).ToList();
            var nobetGrupGorevTipler = _nobetGrupGorevTipService.GetList(nobetGorevTipId, nobetGrupIdListe);
            var eczaneNobetSonuclar  = _eczaneNobetSonucService.GetEczaneGrupNobetSonuc(nobetUstGrupId);

            var eczaneNobetGruplarTumu = _eczaneNobetGrupService.GetList(nobetGrupIdListe, baslangicTarihi, bitisTarihi);

            var eczaneNobetMazeretNobettenDusenler = _eczaneNobetMazeretService.GetEczaneNobetMazeretSayilari(baslangicTarihi, bitisTarihi, nobetGrupIdListe);
            //var eczaneNobettenMuafOlanlar = _eczaneNobetMuafiyetService.GetDetaylar(baslangicTarihi, bitisTarihi, nobetGrupIdListe);

            var eczaneNobetGruplar = _eczaneNobetGrupService.GetDetaylar(nobetGrupIdListe, baslangicTarihi, bitisTarihi)
                                     .Where(w => !eczaneNobetMazeretNobettenDusenler.Select(s => s.EczaneNobetGrupId).Contains(w.Id)
                                            //&& !eczaneNobettenMuafOlanlar.Select(s => s.EczaneId).Contains(w.EczaneId)
                                            ).ToList();

            var eczaneNobetSonuclarCozulenGrup = eczaneNobetSonuclar
                                                 .Where(w => !eczaneNobetMazeretNobettenDusenler.Select(s => s.EczaneNobetGrupId).Contains(w.EczaneNobetGrupId)
                                                        //&& !eczaneNobettenMuafOlanlar.Select(s => s.EczaneId).Contains(w.EczaneId)
                                                        && nobetGrupIdListe.Contains(w.NobetGrupId)).ToList();

            var enSonNobetDurumlari = eczaneNobetSonuclarCozulenGrup
                                      .GroupBy(g => new
            {
                g.NobetGunKuralId,
                g.EczaneNobetGrupId,
                g.EczaneId,
                g.EczaneAdi,
                g.NobetGrupId,
                g.NobetGrupAdi,
                g.NobetGorevTipId
            })
                                      .Select(s => new EczaneNobetGrupGunKuralIstatistik
            {
                NobetGunKuralId   = s.Key.NobetGunKuralId,
                EczaneNobetGrupId = s.Key.EczaneNobetGrupId,
                EczaneId          = s.Key.EczaneId,
                EczaneAdi         = s.Key.EczaneAdi,
                NobetGrupId       = s.Key.NobetGrupId,
                NobetGrupAdi      = s.Key.NobetGrupAdi,
                NobetGorevTipId   = s.Key.NobetGorevTipId,
                IlkNobetTarihi    = s.Min(c => c.Tarih),
                SonNobetTarihi    = s.Max(c => c.Tarih),
                NobetSayisi       = s.Count()
            }).ToList();

            var sonucuOlanGunler = enSonNobetDurumlari
                                   .Select(s => new { s.NobetGunKuralId, s.NobetGorevTipId })
                                   .Distinct()
                                   .OrderBy(o => o.NobetGorevTipId).ThenBy(t => t.NobetGunKuralId).ToList();

            var varsayilanBaslangicNobetTarihi = new DateTime(2012, 1, 1);

            foreach (var nobetGunKural in sonucuOlanGunler)
            {
                var nobetDurumlari = enSonNobetDurumlari
                                     .Where(w => w.NobetGunKuralId == nobetGunKural.NobetGunKuralId)
                                     .Select(s => s.EczaneNobetGrupId).ToList();

                var sonucuOlmayanlar = eczaneNobetGruplar
                                       .Where(w => !nobetDurumlari.Contains(w.Id)).ToList();

                if (sonucuOlmayanlar.Count > 0)
                {
                    foreach (var eczaneNobetGrup in sonucuOlmayanlar)
                    {
                        enSonNobetDurumlari.Add(new EczaneNobetGrupGunKuralIstatistik
                        {
                            EczaneId          = eczaneNobetGrup.EczaneId,
                            EczaneAdi         = eczaneNobetGrup.EczaneAdi,
                            NobetGrupAdi      = eczaneNobetGrup.NobetGrupAdi,
                            NobetAltGrupId    = 0,
                            EczaneNobetGrupId = eczaneNobetGrup.Id,
                            IlkNobetTarihi    = varsayilanBaslangicNobetTarihi, // eczaneNobetGrup.BaslangicTarihi,
                            SonNobetTarihi    = varsayilanBaslangicNobetTarihi, // eczaneNobetGrup.BaslangicTarihi,
                            NobetGorevTipId   = nobetGunKural.NobetGorevTipId,
                            NobetGunKuralId   = nobetGunKural.NobetGunKuralId,
                            NobetGrupId       = eczaneNobetGrup.NobetGrupId,
                            NobetSayisi       = 1
                        });
                    }
                }
            }

            var grupluEczaneNobetSonuclar = eczaneNobetSonuclar
                                            .Where(w => w.Tarih.Year == yilBitis &&
                                                   w.Tarih.Month == ayBitis).ToList();

            var eczaneGrupEdges = _eczaneGrupService.GetEdges()
                                  .Where(e => (nobetGrupIdListe.Contains(e.FromNobetGrupId) ||
                                               nobetGrupIdListe.Contains(e.ToNobetGrupId)))
                                  .Where(w => (grupluEczaneNobetSonuclar.Select(s => s.EczaneId).Distinct().Contains(w.From) ||
                                               grupluEczaneNobetSonuclar.Select(s => s.EczaneId).Distinct().Contains(w.To))
                                         )
                                  .ToList();

            //sonuclarda ilişkili eczaneler
            var eczaneGruplar = _eczaneGrupService.GetDetaylar(nobetUstGrupId)
                                .Where(x => x.EczaneGrupTanimBitisTarihi == null
                                       //&& x.EczaneGrupTanimTipId == 2 //coğrafi yakınlık hariç
                                       && (eczaneGrupEdges.Select(s => s.From).Distinct().Contains(x.EczaneId) ||
                                           eczaneGrupEdges.Select(s => s.To).Distinct().Contains(x.EczaneId)) &&
                                       nobetGrupIdListe.Contains(x.NobetGrupId)
                                       )
                                .Where(w => !eczaneNobetMazeretNobettenDusenler.Select(s => s.EczaneId).Contains(w.EczaneId)).ToList();

            //fazladan gelen tanımlar var iyileştirmekte fayda var
            var eczaneGrupTanimlar = _eczaneGrupTanimService.GetAktifTanimList(eczaneGruplar.Select(x => x.EczaneGrupTanimId).ToList());
            var eczaneGruplar2     = _eczaneGrupService.GetDetaylarByEczaneGrupTanimId(eczaneGrupTanimlar.Select(s => s.Id).ToList());

            var eczaneGrupNobetSonuclar = grupluEczaneNobetSonuclar
                                          .Where(w => eczaneGruplar2.Select(s => s.EczaneId).Contains(w.EczaneId)).ToList();

            var esGrupluEczaneler = _eczaneNobetGrupService.GetDetaylar(nobetUstGrupId)
                                    .Where(x => nobetGrupIdListe.Contains(x.NobetGrupId) &&
                                           x.BitisTarihi == null &&
                                           !eczaneNobetMazeretNobettenDusenler.Select(s => s.EczaneId).Contains(x.EczaneId))
                                    .Select(x => x.EczaneId).Distinct().ToList();

            //var eczaneNobetGruplar = _eczaneNobetGrupService.GetAktifEczaneGrupList(nobetGruplar.Select(w => w.Id).ToList())
            //    .Where(s => !eczaneNobetMazeretNobettenDusenler.Select(f => f.EczaneId).Contains(s.EczaneId)).ToList();

            //nöbet yazılacak tarih aralığı(örn. Ocak ayının tüm günleri)
            var tarihAralik = _takvimService.GetTakvimNobetGruplar(baslangicTarihi, bitisTarihi, nobetGrupIdListe, nobetGorevTipId);

            //var eczaneKumulatifHedefler = _takvimService
            //    .GetEczaneKumulatifHedeflerTumYillar(yilBaslangic, yilBitis, ayBaslangic, ayBitis, nobetGrupIdListe);

            var eczaneKumulatifHedefler = _takvimService.GetEczaneKumulatifHedefler(yilBaslangic, yilBitis, ayBaslangic, ayBitis, nobetGrupIdListe, nobetGorevTipId)
                                          .Where(w => eczaneNobetGruplar.Select(s => s.EczaneId).Contains(w.EczaneId)).ToList();

            var eczaneNobetTarihAralik = _takvimService.GetEczaneNobetTarihAralik(baslangicTarihi, bitisTarihi, nobetGorevTipId, nobetGrupIdListe)
                                         .Where(w => eczaneNobetGruplar.Select(s => s.EczaneId).Contains(w.EczaneId)).ToList();

            var takvimNobetGrupGunDegerIstatistikler = _takvimService.GetTakvimNobetGrupGunDegerIstatistikler(nobetUstGrupBaslangicTarihi, bitisTarihi, nobetGrupIdListe, nobetGorevTipId);

            #region aynı gün nöbet tutan eczaneler

            /*
             * var ayniGunNobetTutmasiTakipEdilecekGruplar = new List<int> { 20, 21, 22 };
             *
             * //nöbet yazılacak tarih aralığı(örn. Ocak ayının tüm günleri)
             * int cozumOncekiAyi = GetOncekiAy(periyot: 3, cozumAyi: ayBitis);
             * var cozumOncekiIkiAyi = GetOncekiAy(periyot: 2, cozumAyi: ayBitis);
             * var aktifSonuclar = _eczaneNobetSonucAktifService.GetSonuclarAylik(yilBitis, ayBitis, nobetUstGrupId);
             * var ayniAydakiDigerGruplarinSonuclari = _eczaneNobetSonucService.GetSonuclarAylik(yilBitis, ayBitis, nobetUstGrupId)
             *  .Where(w => ayniGunNobetTutmasiTakipEdilecekGruplar.Contains(w.NobetGrupId)).ToList();
             *
             * var ayIcindekiTumSonuclar = aktifSonuclar.Union(ayniAydakiDigerGruplarinSonuclari).ToList();
             * var ayIcindeCozulenNobetGruplar = ayIcindekiTumSonuclar.Select(s => s.NobetGrupId).Distinct().ToList();
             *
             #region son iki ay
             *
             * var sonIkiAyBakilacakGruplar = new List<int>();
             *
             * foreach (var item in ayIcindeCozulenNobetGruplar)
             * {
             *  sonIkiAyBakilacakGruplar.Add(item);
             * }
             *
             * //şimdi çözülecek grup
             * foreach (var item in nobetGrupIdListe)
             * {
             *  sonIkiAyBakilacakGruplar.Add(item);
             * }
             *
             * var sonIkiAyAyniGunNobetTutanEczaneler = new List<EczaneCiftGrup>();
             * var gruplar = sonIkiAyBakilacakGruplar.Distinct().ToList();
             *
             * if (_nobetUstGrupKisitService.GetKisitPasifMi("sonIkiAydakiGrup", nobetUstGrupId) && sonIkiAyBakilacakGruplar.Count() > 1 && ayBitis > 1)
             * {
             *  var sonIkiAydakiSonuclar = _eczaneNobetSonucService.GetSonuclar(yilBitis, cozumOncekiAyi, ayBitis - 1, nobetUstGrupId)
             *   .Where(x => gruplar.Contains(x.NobetGrupId)
             *          && ayniGunNobetTutmasiTakipEdilecekGruplar.Contains(x.NobetGrupId)).ToList();
             *
             *  sonIkiAyAyniGunNobetTutanEczaneler = _eczaneNobetOrtakService.GetCiftGrupluEczaneler(sonIkiAydakiSonuclar, 1);
             * }
             #endregion
             *
             #region yillik kümülatif
             *
             * var yilIcindeAyniGunNobetTutanEczaneler = new List<EczaneCiftGrup>();
             *
             * if (_nobetUstGrupKisitService.GetKisitPasifMi("yildaEncokUcKezGrup", nobetUstGrupId) && sonIkiAyBakilacakGruplar.Count() > 1 && ayBitis > 2)
             * {
             *  var yillikKumulatifSonuclar = _eczaneNobetSonucService.GetSonuclarYillikKumulatif(yilBitis, ayBitis - 1, nobetUstGrupId)
             *      .Where(x => gruplar.Contains(x.NobetGrupId)
             *              && ayniGunNobetTutmasiTakipEdilecekGruplar.Contains(x.NobetGrupId)).ToList();
             *
             *  yilIcindeAyniGunNobetTutanEczaneler = _eczaneNobetOrtakService.GetCiftGrupluEczaneler(yillikKumulatifSonuclar, 3);
             *
             *  yilIcindeAyniGunNobetTutanEczaneler = (from a in yilIcindeAyniGunNobetTutanEczaneler
             *                                         from t in _eczaneNobetGrupAltGrupService.GetDetaylar()
             *                                              .Where(w => w.EczaneId == a.EczaneId).DefaultIfEmpty()
             *                                         select new EczaneCiftGrup
             *                                         {
             *                                             Id = a.Id,
             *                                             NobetAltGrupId = (t?.EczaneId == a.EczaneId) ? t.NobetAltGrupId : 0,
             *                                             EczaneId = a.EczaneId,
             *                                             BirlikteNobetTutmaSayisi = a.BirlikteNobetTutmaSayisi
             *                                         }).ToList();
             * }
             #endregion
             *
             * var ayIcindeAyniGunNobetTutanEczaneler = new List<EczaneCiftGrup>();
             */
            #endregion

            var mersinMerkezDataModel = new MersinMerkezDataModel()
            {
                Yil                                  = yilBitis,
                Ay                                   = ayBitis,
                LowerBound                           = 0,
                UpperBound                           = 1,
                NobetUstGrupId                       = nobetUstGrupId,
                EczaneNobetTarihAralik               = eczaneNobetTarihAralik,  //karar değişkeni
                EczaneKumulatifHedefler              = eczaneKumulatifHedefler, //.Where(w => w.EczaneId != 121).ToList(),
                TarihAraligi                         = tarihAralik,
                NobetGruplar                         = nobetGruplar,
                EczaneGrupTanimlar                   = eczaneGrupTanimlar,
                EczaneGruplar                        = eczaneGruplar2,
                EczaneNobetMazeretler                = _eczaneNobetMazeretService.GetDetaylar(yilBitis, ayBitis, esGrupluEczaneler),
                EczaneNobetIstekler                  = _eczaneNobetIstekService.GetDetaylarByNobetGrupIdList(yilBitis, ayBitis, nobetGrupIdListe),
                NobetGrupGunKurallar                 = _nobetGrupGunKuralService.GetAktifList(nobetGrupIdListe),
                NobetGrupKurallar                    = _nobetGrupKuralService.GetDetaylar(nobetGrupIdListe),
                NobetGrupGorevTipler                 = _nobetGrupGorevTipService.GetList(nobetGorevTipId, nobetGrupIdListe),
                NobetGrupTalepler                    = _nobetGrupTalepService.GetDetaylar(nobetGrupIdListe, baslangicTarihi, bitisTarihi),
                EczaneNobetGruplar                   = eczaneNobetGruplar,
                NobetUstGrupKisitlar                 = _nobetUstGrupKisitService.GetDetaylar(nobetUstGrupId),
                EczaneGrupNobetSonuclar              = eczaneGrupNobetSonuclar,
                EczaneGrupNobetSonuclarTumu          = eczaneNobetSonuclar,
                EczaneNobetSonuclar                  = eczaneNobetSonuclarCozulenGrup,
                EczaneNobetGrupGunKuralIstatistikler = enSonNobetDurumlari,
                TakvimNobetGrupGunDegerIstatistikler = takvimNobetGrupGunDegerIstatistikler

                                                       #region aynı gün nöbet tutma durumu
                                                       //AyIcindeAyniGunNobetTutanEczaneler = ayIcindeAyniGunNobetTutanEczaneler, //bu alan EczaneNobetCozAktifiGuncelle içinde kullanılıyor.
                                                       //YilIcindeAyniGunNobetTutanEczaneler = yilIcindeAyniGunNobetTutanEczaneler,
                                                       //SonIkiAyAyniGunNobetTutanEczaneler = sonIkiAyAyniGunNobetTutanEczaneler,
                                                       //EczaneNobetSonuclarSonIkiAy = _eczaneNobetSonucService.GetSonuclar(yilBitis, cozumOncekiIkiAyi, ayBitis, nobetUstGrupId),
                                                       //EczaneNobetSonuclarOncekiAylar = _eczaneNobetSonucService.GetSonuclar(yilBitis, ayBaslangic, ayBitis, nobetUstGrupId)
                                                       #endregion
            };
            return(mersinMerkezDataModel);
        }
        private IskenderunDataModel EczaneNobetDataModel(EczaneNobetDataModelParametre eczaneNobetDataModelParametre)
        {
            #region parametreler
            var nobetUstGrupId   = eczaneNobetDataModelParametre.NobetUstGrupId;
            var nobetGrupIdListe = eczaneNobetDataModelParametre.NobetGrupId.ToList();
            //var nobetGorevTipId = eczaneNobetDataModelParametre.NobetGorevTipId;
            var nobetUstGrupBaslangicTarihi = eczaneNobetDataModelParametre.NobetUstGrupBaslangicTarihi;
            var baslangicTarihi             = eczaneNobetDataModelParametre.BaslangicTarihi;
            var bitisTarihi          = eczaneNobetDataModelParametre.BitisTarihi;
            var nobetGrupGorevTipler = eczaneNobetDataModelParametre.NobetGrupGorevTipler.Where(W => nobetGrupIdListe.Contains(W.NobetGrupId)).ToList();
            var nobetGorevTipler     = eczaneNobetDataModelParametre.NobetGrupGorevTipler.Select(s => s.NobetGorevTipId).Distinct().ToList();
            #endregion

            if (baslangicTarihi < nobetUstGrupBaslangicTarihi)
            {
                throw new Exception($"Nöbet başlangıç tarihi <strong>({baslangicTarihi.ToShortDateString()})</strong> üst grup başlama tarihinden <strong>({nobetUstGrupBaslangicTarihi.ToShortDateString()})</strong> küçük olamaz.");
            }

            var debugYapilacakEczaneler = _debugEczaneService.GetDetaylarAktifOlanlar(nobetUstGrupId);

            var nobetGruplar = _nobetGrupService.GetDetaylar(nobetGrupIdListe).OrderBy(s => s.Id).ToList();
            //var nobetGrupGorevTipler = _nobetGrupGorevTipService.GetDetaylar(nobetGrupIdListe); //nobetGorevTipId,
            var eczaneNobetSonuclar = _eczaneNobetSonucService.GetSonuclar(nobetUstGrupId);

            var eczaneNobetMazeretNobettenDusenler = new List <EczaneNobetMazeretSayilari>();

            var mazeret = _nobetUstGrupKisitService.GetKisitPasifMi("mazeret", nobetUstGrupId);

            if (mazeret)
            {
                eczaneNobetMazeretNobettenDusenler = _eczaneNobetMazeretService.GetEczaneNobetMazeretSayilari(baslangicTarihi, bitisTarihi, nobetGrupIdListe);
            }

            var eczaneNobetGruplarTumu = _eczaneNobetGrupService.GetDetaylar(nobetGrupIdListe, baslangicTarihi, bitisTarihi)
                                         .Where(w => !eczaneNobetMazeretNobettenDusenler.Select(s => s.EczaneNobetGrupId).Contains(w.Id)
                                                //&& w.EczaneAdi == "ÖZGÜR"
                                                ).ToList();

            var nobetGorevTipId = 7;
            //if (!nobetGorevTipler.Contains(nobetGorevTipId))
            //    nobetGorevTipId = 0;

            //var eczaneNobetGruplarGorevTip1 = eczaneNobetGruplarTumu
            //    .Where(w => w.NobetGorevTipId == nobetGorevTipId).ToList();

            //nobetGorevTipId = 2;
            //if (!nobetGorevTipler.Contains(nobetGorevTipId))
            //    nobetGorevTipId = 0;

            //var eczaneNobetGruplarGorevTip2 = eczaneNobetGruplarTumu
            //    .Where(w => w.NobetGorevTipId == nobetGorevTipId).ToList();

            var eczaneNobetSonuclarOncekiAylar = eczaneNobetSonuclar
                                                 .Where(w => w.Tarih >= nobetUstGrupBaslangicTarihi &&
                                                        eczaneNobetGruplarTumu.Select(s => s.Id).Contains(w.EczaneNobetGrupId) //görevtip: tümü
                                                                                                                               //&& eczaneNobetGruplarGorevTip1.Select(s => s.Id).Contains(w.EczaneNobetGrupId) //görevtip: 1
                                                        ).ToList();

            var eczaneNobetSonuclarCozulenGruplar = eczaneNobetSonuclar
                                                    .Where(w => eczaneNobetGruplarTumu.Select(s => s.Id).Contains(w.EczaneNobetGrupId)).ToList();

            var sonuclarKontrol = _eczaneNobetSonucService.GetSonuclar(baslangicTarihi, bitisTarihi, eczaneNobetSonuclarCozulenGruplar);

            if (sonuclarKontrol.Count > 0)
            {
                throw new Exception("Kriterlere uygun <strong>daha önce yazılmış nöbetler</strong> bulunmaktadır. Lütfen kontrol ediniz!");
            }

            var enSonNobetler = _eczaneNobetOrtakService.GetEczaneNobetGrupGunKuralIstatistik(eczaneNobetGruplarTumu, eczaneNobetSonuclarCozulenGruplar);

            var eczaneNobetGrupGunKuralIstatistikYatay = _eczaneNobetOrtakService.GetEczaneNobetGrupGunKuralIstatistikYatay(enSonNobetler);
            var eczaneBazliGunKuralIstatistikYatay     = _eczaneNobetOrtakService.GetEczaneBazliGunKuralIstatistikYatay(enSonNobetler);

            //var bak = eczaneNobetGrupGunKuralIstatistikYatay.Where(w => w.NobetGorevTipId == 2).ToList();

            var anahtarListe = eczaneNobetSonuclar
                               .Where(w => w.Tarih < nobetUstGrupBaslangicTarihi && nobetGrupIdListe.Contains(w.NobetGrupId)).ToList();

            //var haftaIciAnahtarListeTumEczaneler = _takvimService.AnahtarListeyiBuGuneTasi(nobetGrupIdListe, 1, nobetUstGrupBaslangicTarihi, eczaneNobetGruplarTumu, eczaneNobetGrupGunKuralIstatistikYatay, anahtarListe, "Hafta İçi");
            var haftaIciAnahtarListeTumEczaneler = _takvimService.AnahtarListeyiBuGuneTasi(nobetGrupIdListe, nobetGorevTipId, nobetUstGrupBaslangicTarihi, eczaneNobetGruplarTumu, eczaneNobetGrupGunKuralIstatistikYatay, anahtarListe, "Hafta İçi");

            var nobetBorcluEczanelerhaftaIci = (from s in eczaneNobetGrupGunKuralIstatistikYatay
                                                from b in haftaIciAnahtarListeTumEczaneler
                                                where s.EczaneNobetGrupId == b.EczaneNobetGrupId &&
                                                s.NobetSayisiHaftaIci == b.NobetSayisi
                                                select new EczaneNobetAlacakVerecek
            {
                EczaneNobetGrupId = s.EczaneNobetGrupId,
                EczaneId = s.EczaneId,
                EczaneAdi = s.EczaneAdi,
                NobetGrupAdi = s.NobetGrupAdi,
                NobetGrupId = s.NobetGrupId,
                NobetSayisi = s.NobetSayisiHaftaIci,
                SonNobetTarihi = s.SonNobetTarihiHaftaIci,
                AnahtarTarih = b.Tarih,
                BorcluGunSayisi = (int)(s.NobetSayisiHaftaIci > 0
                                                            ? (s.SonNobetTarihiHaftaIci - b.Tarih).TotalDays
                                                            : (s.SonNobetTarihiHaftaIci - b.Tarih).TotalDays - (s.SonNobetTarihiHaftaIci - b.NobetUstGrupBaslamaTarihi).TotalDays),
                GunGrupAdi = "Hafta İçi"
            }).ToList();

            foreach (var eczane in nobetBorcluEczanelerhaftaIci)
            {
                eczaneNobetGrupGunKuralIstatistikYatay
                .Where(w => w.EczaneNobetGrupId == eczane.EczaneNobetGrupId)
                .FirstOrDefault().BorcluNobetSayisiHaftaIci = (int)eczane.BorcluGunSayisi;
            }

            var grupluEczaneNobetSonuclar = _eczaneNobetSonucService.GetSonuclar(baslangicTarihi, bitisTarihi, eczaneNobetSonuclar);

            var eczaneGrupEdges = _eczaneGrupService.GetEdges(nobetUstGrupId)
                                  .Where(e => (nobetGrupIdListe.Contains(e.FromNobetGrupId) ||
                                               nobetGrupIdListe.Contains(e.ToNobetGrupId)))
                                  .Where(w => (grupluEczaneNobetSonuclar.Select(s => s.EczaneId).Distinct().Contains(w.From) ||
                                               grupluEczaneNobetSonuclar.Select(s => s.EczaneId).Distinct().Contains(w.To))
                                         ).ToList();

            //sonuçlarda ilişkili eczaneler
            var eczaneGruplar = _eczaneGrupService.GetDetaylarAktifGruplar(nobetUstGrupId)
                                .Where(x => (eczaneGrupEdges.Select(s => s.From).Distinct().Contains(x.EczaneId) || eczaneGrupEdges.Select(s => s.To).Distinct().Contains(x.EczaneId)) ||
                                       nobetGrupIdListe.Contains(x.NobetGrupId)
                                       ).ToList();

            //fazladan gelen tanımlar var iyileştirmekte fayda var
            var eczaneGrupTanimlar = _eczaneGrupTanimService.GetDetaylarAktifTanimList(eczaneGruplar.Select(x => x.EczaneGrupTanimId).ToList());
            var eczaneGruplar2     = _eczaneGrupService.GetDetaylarByEczaneGrupTanimId(eczaneGrupTanimlar.Select(s => s.Id).ToList());

            var eczaneGrupNobetSonuclar = grupluEczaneNobetSonuclar
                                          .Where(w => eczaneGruplar2.Select(s => s.EczaneId).Contains(w.EczaneId)).ToList();

            //nöbet yazılacak tarih aralığı(örn. Ocak ayının tüm günleri)
            var tarihAralik = _takvimService.GetTakvimNobetGruplar(baslangicTarihi, bitisTarihi, nobetGrupGorevTipler);

            var eczaneKumulatifHedefler  = new List <EczaneNobetIstatistik>();
            var eczaneNobetIstatistikler = new List <EczaneNobetIstatistik>();

            //2.görev tipi için sadece cumartesi olduğu için tüm günler tüm görev tiplerini almaya gerek yok.
            //var eczaneNobetTarihAralik = _takvimService.GetEczaneNobetTarihAralik(baslangicTarihi, bitisTarihi, nobetGrupGorevTipler)
            //    .Where(w => eczaneNobetGruplar.Select(s => s.EczaneId).Contains(w.EczaneId)).ToList();
            var nobetGrupGorevTipGunKurallar = _nobetGrupGorevTipGunKuralService.GetDetaylarAktifList(nobetGrupGorevTipler.Select(s => s.Id).ToList());

            var eczaneNobetTarihAralikTumu = _takvimService.GetEczaneNobetTarihAralik(baslangicTarihi, bitisTarihi, nobetGorevTipId, nobetGrupIdListe)
                                             .Where(w => eczaneNobetGruplarTumu.Select(s => s.EczaneId).Contains(w.EczaneId)).ToList();
            //new List<EczaneNobetTarihAralik>();

            //foreach (var nobetGrupGorevTip in nobetGrupGorevTipler)
            //{
            //    nobetGorevTipId = nobetGrupGorevTip.NobetGorevTipId;
            //    var nobetGrupGorevTip1 = nobetGrupGorevTipler.Where(w => w.NobetGorevTipId == nobetGorevTipId).ToList();

            //    var eczaneNobetTarihAralik1 = _takvimService.GetEczaneNobetTarihAralik(baslangicTarihi, bitisTarihi, nobetGrupGorevTip1)
            //        .Where(w => eczaneNobetGruplarTumu.Select(s => s.Id).Contains(w.EczaneNobetGrupId)).ToList();

            //    eczaneNobetTarihAralikTumu.AddRange(eczaneNobetTarihAralik1);
            //}

            var eczaneNobetTarihAralik = _eczaneNobetOrtakService.AmacFonksiyonuKatsayisiBelirle(eczaneNobetTarihAralikTumu, eczaneNobetGrupGunKuralIstatistikYatay);

            //2. karar değişkeni. her eczane ve ilgili altgrup
            var eczaneNobetAltGrupTarihAralik = _takvimService.GetEczaneNobetAltGrupTarihAralik(baslangicTarihi, bitisTarihi, nobetGorevTipId, nobetGrupIdListe)
                                                .Where(w => eczaneNobetGruplarTumu.Select(s => s.EczaneId).Contains(w.EczaneId)).ToList();

            var ikiliEczaneler = _ayniGunTutulanNobetService.GetDetaylar(nobetGrupIdListe);

            var eczaneNobetIstekler = _eczaneNobetIstekService.GetDetaylarByNobetGrupIdList(baslangicTarihi, bitisTarihi.AddDays(10), nobetGrupIdListe)
                                      .Where(w => eczaneNobetGruplarTumu.Select(s => s.EczaneId).Contains(w.EczaneId)).ToList();

            var eczaneNobetMazeretler = _eczaneNobetMazeretService.GetDetaylarByEczaneIdList(baslangicTarihi, bitisTarihi, eczaneNobetGruplarTumu.Select(s => s.EczaneId).Distinct().ToList())
                                        .Where(w => w.MazeretId != 3)
                                        .ToList();

            var takvimNobetGrupGunDegerIstatistikler = _takvimService.GetTakvimNobetGrupGunDegerIstatistikler(nobetUstGrupBaslangicTarihi, bitisTarihi, nobetGrupGorevTipler);

            var eczaneNobetGrupAltGruplar           = _eczaneNobetGrupAltGrupService.GetDetaylar(nobetUstGrupId);
            var eczaneNobetGrupAltGruplarAcil       = _eczaneNobetGrupAltGrupService.GetDetaylarByNobetGrupId(53).Where(w => w.NobetAltGrupId == 37).ToList();
            var eczaneNobetGrupAltGruplarPalmiye    = _eczaneNobetGrupAltGrupService.GetDetaylarByNobetGrupId(54).Where(w => w.NobetAltGrupId == 43).ToList();
            var eczaneNobetGrupAltGruplarYeniDevlet = _eczaneNobetGrupAltGrupService.GetDetaylarByNobetGrupId(54).Where(w => w.NobetAltGrupId == 44).ToList();

            var altGruplarlaAyniGunNobetTutma           = _nobetUstGrupKisitService.GetDetay("altGruplarlaAyniGunNobetTutma", nobetUstGrupId);
            var altGruplarlaAyniGunNobetTutmaPalmiye    = altGruplarlaAyniGunNobetTutma;//_nobetUstGrupKisitService.GetDetay("altGruplarlaAyniGunNobetTutma", nobetUstGrupId);
            var altGruplarlaAyniGunNobetTutmaYeniDevlet = altGruplarlaAyniGunNobetTutma;

            var eczaneNobetSonuclarAltGruplaAyniGun           = new List <EczaneNobetSonucListe2>();
            var eczaneNobetSonuclarAltGruplaAyniGunPalmiye    = new List <EczaneNobetSonucListe2>();
            var eczaneNobetSonuclarAltGruplaAyniGunYeniDevlet = new List <EczaneNobetSonucListe2>();

            var indisId = 0;

            var altGruplarlaAyniGunNobetTutmayacakEczanelerCarsi      = new List <EczaneGrupDetay>();
            var altGruplarlaAyniGunNobetTutmayacakEczanelerSsk        = new List <EczaneGrupDetay>();
            var altGruplarlaAyniGunNobetTutmayacakEczanelerYeniDevlet = new List <EczaneGrupDetay>();

            if (!altGruplarlaAyniGunNobetTutma.PasifMi)
            {
                //indisId = eczaneGruplar2.Select(s => s.EczaneGrupTanimId).Max();

                #region çarşı

                var altGrupluTakipEdilecekNobetGrupIdList =
                    new List <int> {
                    44,                 //Çarşı
                    53,                 //SSK - alt grubu olan
                };

                var eczaneNobetGruplarAltGruplaAyniGun = _eczaneNobetGrupService.GetDetaylar(altGrupluTakipEdilecekNobetGrupIdList, baslangicTarihi, bitisTarihi)
                                                         .Where(w => !eczaneNobetMazeretNobettenDusenler.Select(s => s.EczaneNobetGrupId).Contains(w.Id)).ToList();

                eczaneNobetSonuclarAltGruplaAyniGun = eczaneNobetSonuclar
                                                      .Where(w => altGrupluTakipEdilecekNobetGrupIdList.Contains(w.NobetGrupId)).ToList();

                var ayniGunNobetTutmasiTakipEdilecekGruplar = new List <int>
                {
                    44,    //Çarşı
                };
                var altGrubuOlanNobetGruplar = new List <int>
                {
                    53    //SSK
                };

                altGruplarlaAyniGunNobetTutmayacakEczanelerCarsi = _eczaneNobetOrtakService.AltGruplarlaSiraliNobetListesiniOlusturMersin(eczaneNobetSonuclarAltGruplaAyniGun, eczaneNobetGruplarAltGruplaAyniGun, eczaneNobetGrupAltGruplarAcil, altGruplarlaAyniGunNobetTutma, nobetUstGrupBaslangicTarihi, indisId, ayniGunNobetTutmasiTakipEdilecekGruplar, altGrubuOlanNobetGruplar, 37, (int)altGruplarlaAyniGunNobetTutma.SagTarafDegeri);
                #endregion
            }

            if (!altGruplarlaAyniGunNobetTutmaPalmiye.PasifMi)
            {
                //indisId = eczaneGruplar2.Select(s => s.EczaneGrupTanimId).Max();

                #region ssk

                var altGrupluTakipEdilecekNobetGrupIdList =
                    new List <int> {
                    53,                        //SSK
                    54,                        //Gelişim - alt grubu olan
                };

                var eczaneNobetGruplarAltGruplaAyniGun = _eczaneNobetGrupService.GetDetaylar(altGrupluTakipEdilecekNobetGrupIdList, baslangicTarihi, bitisTarihi)
                                                         .Where(w => !eczaneNobetMazeretNobettenDusenler.Select(s => s.EczaneNobetGrupId).Contains(w.Id)).ToList();

                eczaneNobetSonuclarAltGruplaAyniGun = eczaneNobetSonuclar
                                                      .Where(w => altGrupluTakipEdilecekNobetGrupIdList.Contains(w.NobetGrupId)).ToList();

                var ayniGunNobetTutmasiTakipEdilecekGruplar = new List <int>
                {
                    53,    //ssk
                };
                var altGrubuOlanNobetGruplar = new List <int>
                {
                    54    //gelişim
                };

                altGruplarlaAyniGunNobetTutmayacakEczanelerSsk = _eczaneNobetOrtakService.AltGruplarlaSiraliNobetListesiniOlusturMersin(eczaneNobetSonuclarAltGruplaAyniGun, eczaneNobetGruplarAltGruplaAyniGun, eczaneNobetGrupAltGruplarPalmiye, altGruplarlaAyniGunNobetTutma, nobetUstGrupBaslangicTarihi, indisId, ayniGunNobetTutmasiTakipEdilecekGruplar, altGrubuOlanNobetGruplar, 43, (int)altGruplarlaAyniGunNobetTutmaPalmiye.SagTarafDegeri);

                altGruplarlaAyniGunNobetTutmayacakEczanelerYeniDevlet = _eczaneNobetOrtakService.AltGruplarlaSiraliNobetListesiniOlusturMersin(eczaneNobetSonuclarAltGruplaAyniGun, eczaneNobetGruplarAltGruplaAyniGun, eczaneNobetGrupAltGruplarYeniDevlet, altGruplarlaAyniGunNobetTutma, nobetUstGrupBaslangicTarihi, indisId, ayniGunNobetTutmasiTakipEdilecekGruplar, altGrubuOlanNobetGruplar, 44, (int)altGruplarlaAyniGunNobetTutmaYeniDevlet.SagTarafDegeri);
                #endregion
            }


            #region önceki aylar aynı gün nöbet tutanlar çözülen ayda aynı gün nöbetçi olmasın

            var oncekiAylardaAyniGunNobetTutanEczaneler = new List <EczaneGrupDetay>();

            var oncekiAylarAyniGunNobet = _nobetUstGrupKisitService.GetDetay("oncekiAylarAyniGunNobet", nobetUstGrupId);

            if (!oncekiAylarAyniGunNobet.PasifMi)
            {
                oncekiAylardaAyniGunNobetTutanEczaneler = _eczaneNobetSonucService.OncekiAylardaAyniGunNobetTutanlar(baslangicTarihi, eczaneNobetSonuclarOncekiAylar, 0, (int)oncekiAylarAyniGunNobet.SagTarafDegeri);
            }

            #endregion

            #region sonraki aydaki istekler
            var sonrakiAy            = bitisTarihi.AddDays(1);
            var bitisTarihiSonrakiAy = bitisTarihi.AddMonths((int)oncekiAylarAyniGunNobet.SagTarafDegeri + 2);

            var eczaneNobetIsteklerSonrakiDonem = _eczaneNobetIstekService.GetDetaylarByNobetGrupIdList(sonrakiAy, bitisTarihiSonrakiAy, nobetGrupIdListe)
                                                  .Where(w => eczaneNobetGruplarTumu.Select(s => s.EczaneId).Contains(w.EczaneId)).ToList();

            var sonrakiDonemAyniGunNobetIstekGirilenler = _eczaneNobetIstekService.SonrakiAylardaAyniGunIstekGirilenEczaneler(eczaneNobetIsteklerSonrakiDonem);
            #endregion

            var nobetGrupKurallar = _nobetGrupKuralService.GetDetaylarByNobetGrupGorevTipIdList(nobetGrupGorevTipler.Select(s => s.Id).ToList());

            var nobetUstGrupKisitlar = _nobetUstGrupKisitService.GetDetaylar(nobetUstGrupId);
            var grupBazliKisitlar    = _nobetGrupGorevTipKisitService.GetDetaylar(nobetUstGrupId);

            var iskenderunDataModel = new IskenderunDataModel()
            {
                Yil                         = eczaneNobetDataModelParametre.YilBaslangic,
                Ay                          = eczaneNobetDataModelParametre.AyBitis,
                TimeLimit                   = eczaneNobetDataModelParametre.TimeLimit,
                CalismaSayisiLimit          = eczaneNobetDataModelParametre.CalismaSayisi,
                LowerBound                  = 0,
                UpperBound                  = 1,
                BaslangicTarihi             = baslangicTarihi,
                BitisTarihi                 = bitisTarihi,
                NobetUstGrupBaslangicTarihi = nobetUstGrupBaslangicTarihi,
                NobetUstGrupId              = nobetUstGrupId,
                EczaneNobetTarihAralik      = eczaneNobetTarihAralik,  //karar değişkeni
                EczaneKumulatifHedefler     = eczaneKumulatifHedefler, //.Where(w => w.EczaneId != 121).ToList(),
                EczaneNobetIstatistikler    = eczaneNobetIstatistikler,
                EczaneNobetMazeretler       = eczaneNobetMazeretler,
                EczaneGrupTanimlar          = eczaneGrupTanimlar,
                TarihAraligi                = tarihAralik,
                NobetGruplar                = nobetGruplar,
                EczaneGruplar               = eczaneGruplar2,
                //AyniGunNobetTutanEsGruplar = ayniGunNoetTutanEczaneGruplar,
                AltGruplarlaAyniGunNobetTutmayacakEczanelerCarsi      = altGruplarlaAyniGunNobetTutmayacakEczanelerCarsi,
                AltGruplarlaAyniGunNobetTutmayacakEczanelerSsk        = altGruplarlaAyniGunNobetTutmayacakEczanelerSsk,
                AltGruplarlaAyniGunNobetTutmayacakEczanelerYeniDevlet = altGruplarlaAyniGunNobetTutmayacakEczanelerYeniDevlet,
                OncekiAylardaAyniGunNobetTutanEczaneler = oncekiAylardaAyniGunNobetTutanEczaneler,
                EczaneNobetIstekler          = eczaneNobetIstekler,
                NobetGrupGunKurallar         = _nobetGrupGunKuralService.GetDetaylarAktifList(nobetGrupIdListe),
                NobetGrupGorevTipGunKurallar = _nobetGrupGorevTipGunKuralService.GetDetaylarAktifList(nobetGrupGorevTipler.Select(s => s.Id).ToList()),
                NobetGrupKurallar            = nobetGrupKurallar,
                NobetGrupGorevTipler         = nobetGrupGorevTipler,
                NobetGrupTalepler            = _nobetGrupTalepService.GetDetaylar(nobetGrupIdListe, baslangicTarihi, bitisTarihi),
                EczaneNobetGruplar           = eczaneNobetGruplarTumu,
                Kisitlar                                = nobetUstGrupKisitlar,
                NobetUstGrupKisitlar                    = nobetUstGrupKisitlar,
                EczaneGrupNobetSonuclar                 = eczaneGrupNobetSonuclar,
                EczaneNobetSonuclar                     = eczaneNobetSonuclarCozulenGruplar,
                EczaneGrupNobetSonuclarTumu             = eczaneNobetSonuclar,
                EczaneNobetSonuclarAltGruplarlaBirlikte = eczaneNobetSonuclarAltGruplaAyniGun,
                EczaneNobetGrupGunKuralIstatistikler    = enSonNobetler,
                TakvimNobetGrupGunDegerIstatistikler    = takvimNobetGrupGunDegerIstatistikler,
                EczaneNobetGrupGunKuralIstatistikYatay  = eczaneNobetGrupGunKuralIstatistikYatay,
                EczaneBazliGunKuralIstatistikYatay      = eczaneBazliGunKuralIstatistikYatay,
                EczaneNobetGrupAltGruplar               = eczaneNobetGrupAltGruplar,
                IkiliEczaneler                          = ikiliEczaneler,
                SonrakiDonemAyniGunNobetIstekGirilenler = sonrakiDonemAyniGunNobetIstekGirilenler,
                NobetGrupGorevTipKisitlar               = grupBazliKisitlar,
                EczaneNobetAltGrupTarihAralik           = eczaneNobetAltGrupTarihAralik,
                NobetAltGruplar                         = _nobetAltGrupService.GetDetaylar(nobetUstGrupId),
                AyniGunNobetTakipGrupAltGruplar         = _ayniGunNobetTakipGrupAltGrupService.GetDetaylar(nobetUstGrupId),
                DebugYapilacakEczaneler                 = debugYapilacakEczaneler
            };

            //_eczaneNobetOrtakService.KurallariKontrolEtHaftaIciEnAzEnCok(nobetUstGrupId, eczaneNobetGrupGunKuralIstatistikYatay);
            _eczaneNobetOrtakService.KurallariKontrolEtMazeretIstek(nobetUstGrupId, eczaneNobetMazeretler, eczaneNobetIstekler);
            _eczaneNobetOrtakService.KurallariKontrolEtIstek(nobetUstGrupId, eczaneNobetIstekler, nobetGrupKurallar);

            return(iskenderunDataModel);
        }