def test_okutman_ders_ucreti_goruntuleme(self):
        for loop in range(2):
            # ogretim_elemani_2 kullanıcısıyla giriş yapılır.
            user = User.objects.get(username='******')
            # testi yazılacak iş akışı seçilir.
            self.prepare_client('/okutman_ders_ucreti_goruntuleme', user=user)
            self.client.post()

            if loop == 0:
                for i in range(2):

                    # 2016 yılı Mayıs ayı seçilir. Veritabanında seçilen yıl ve
                    #  ayı içeren dönem bulunmamaktadır. 'Dönem Bulunamadı' başlıklı
                    # hata mesajının çıkması beklenir.
                    resp = self.client.post(form={
                        "ay_sec": 5,
                        "yil_sec": 2013,
                        "sec": 1
                    })
                    assert resp.json['forms']['schema'][
                        "title"] == "Dönem Bulunamadı"

                    if i == 0:
                        # İlk döngüde hata mesajından sonra eğer geriye dönülmesi seçilirse,
                        # tarih seçme ekranına geri dönmesi beklenir.
                        resp = self.client.post(form={
                            "iptal": "null",
                            "geri_don": 1,
                            "sec": 1
                        },
                                                flow="tarih_sec")
                        assert resp.json['forms']['schema'][
                            "title"] == "Puantaj Tablosu Hazırlamak İstediğiniz Yıl ve Ayı Seçiniz"

                    if i == 1:
                        # Eğer iptal butonuna basılırsa, işem iptali hakkında bilgilendirme
                        # mesajı çıkması beklenir.
                        resp = self.client.post(
                            form={
                                "iptal": 1,
                                "geri_don": "null",
                                "sec": 1
                            },
                            flow="islem_iptali_bilgilendir")
                        assert resp.json["msgbox"][
                            "title"] == "Durum Mesajı" and "iptal" in resp.json[
                                "msgbox"]["msg"]

            if loop == 1:
                # Geçerli bir dönemin bulunduğu tarih seçilir.
                resp = self.client.post(form={
                    "ay_sec": 11,
                    "yil_sec": 2016,
                    "sec": 1
                })

                # Ders ücreti hesaplama türü seçim ekranına gelmesi beklenir.
                assert resp.json['forms']['schema'][
                    "title"] == u"Puantaj Tablosu Hesaplama Türü Seçiniz"

                # Tür seçildikten sonra ekrana Puantaj Tablosu çıkarılması beklenir.
                resp = self.client.post(form={"ek_ders": 'null', "ders": 1})
                assert "PUANTAJ TABLOSU" in resp.json['forms']['schema'][
                    "title"]

                # Kullanıcı adından öğretim görevlisinin adı soyadı bulunur.
                # Oluşturulan puantaj tablosunun doğru öğretim görevlisi adına
                # oluşturulup oluşturulmadığı kontrol edilir.
                okutman = user.personel.okutman
                okutman_adi = okutman.__unicode__()

                # Bir döneme denk geldiği kontrol edilir.
                donem_list = Donem.takvim_ayina_rastlayan_donemler(2016, 11)
                assert len(donem_list) == 1

                ders_etkinlik_list = doneme_gore_okutman_etkinlikleri(
                    donem_list, okutman, False)

                # Etkinlik olan günlerin etkinlik listede olduğu kontrol edilir.
                for etkinlik in DersEtkinligi.objects.filter(
                        donem=donem_list[0], okutman=okutman, ek_ders=False):
                    assert etkinlik.gun in ders_etkinlik_list[0]

                # Personel izin listesi getirilir.
                personel_izin_list = personel_izin_gunlerini_getir(
                    okutman, 2016, 11)

                birim_unit = Unit.objects.get(
                    yoksis_no=okutman.donemdeki_gorev_yeri(donem_list[0]))
                resmi_tatil_list = resmi_tatil_gunleri_getir(
                    birim_unit, 2016, 5)
                assert 19 and 1 in resmi_tatil_list[0]

                tarih_araligi = ders_etkinligine_gore_tarih_araligi(
                    donem_list, 2016, 11, birim_unit)
                resmi_tatil_list = resmi_tatil_gunleri_getir(
                    birim_unit, 2016, 11)

                aylik_plan = okutman_aylik_plani(donem_list,
                                                 ders_etkinlik_list,
                                                 resmi_tatil_list,
                                                 personel_izin_list,
                                                 tarih_araligi, 2016, 11)

                son_gun = yil_ve_aya_gore_ilk_ve_son_gun(2016, 11)[1].day

                for i in range(son_gun):
                    if resp.json['objects'][1]['fields'][" %i" %
                                                         (i + 1)] == ' ':
                        assert i + 1 not in aylik_plan[0]
                    elif resp.json['objects'][1]['fields'][" %i" %
                                                           (i + 1)] == 'İ':
                        assert aylik_plan[0][i + 1] == 'İ'
                    elif resp.json['objects'][1]['fields'][" %i" %
                                                           (i + 1)] == 'R':
                        assert aylik_plan[0][i + 1] == 'R'
                    else:
                        hafta_gun = date(2016, 11, i + 1).isoweekday()

                        assert resp.json['objects'][1]['fields'][
                            " %i" % (i + 1)] == str(
                                ders_etkinlik_list[0][hafta_gun])
                        assert resp.json['objects'][1]['fields'][
                            " %i" % (i + 1)] == str(aylik_plan[0][i + 1])

                # Personel'in izin günlerinin doğru olup olmadığı test edilir.
                assert personel_izin_list == [16, 17, 18, 19, 20, 21]

                # Puantaj tablosu'nda öğretim görevlisinin isminin olduğu test edilir.
                assert okutman_adi.upper(
                ) in resp.json['forms']['schema']["title"].upper()
    def test_okutman_ders_ucreti_goruntuleme(self):
        for loop in range(2):
            # ogretim_elemani_2 kullanıcısıyla giriş yapılır.
            user = User.objects.get(username='******')
            # testi yazılacak iş akışı seçilir.
            self.prepare_client('/okutman_ders_ucreti_goruntuleme', user=user)
            self.client.post()

            if loop == 0:
                for i in range(2):


                    # 2016 yılı Mayıs ayı seçilir. Veritabanında seçilen yıl ve
                    #  ayı içeren dönem bulunmamaktadır. 'Dönem Bulunamadı' başlıklı
                    # hata mesajının çıkması beklenir.
                    resp = self.client.post(form={"ay_sec": 5, "yil_sec": 2013, "sec": 1})
                    assert resp.json['forms']['schema']["title"] == "Dönem Bulunamadı"

                    if i == 0:
                        # İlk döngüde hata mesajından sonra eğer geriye dönülmesi seçilirse,
                        # tarih seçme ekranına geri dönmesi beklenir.
                        resp = self.client.post(form={"iptal": "null", "geri_don": 1, "sec": 1}, flow="tarih_sec")
                        assert resp.json['forms']['schema'][
                                   "title"] == "Puantaj Tablosu Hazırlamak İstediğiniz Yıl ve Ayı Seçiniz"

                    if i == 1:
                        # Eğer iptal butonuna basılırsa, işem iptali hakkında bilgilendirme
                        # mesajı çıkması beklenir.
                        resp = self.client.post(form={"iptal": 1, "geri_don": "null", "sec": 1},
                                                flow="islem_iptali_bilgilendir")
                        assert resp.json["msgbox"]["title"] == "Durum Mesajı" and "iptal" in resp.json["msgbox"]["msg"]

            if loop == 1:
                # Geçerli bir dönemin bulunduğu tarih seçilir.
                resp = self.client.post(form={"ay_sec": 11 , "yil_sec": 2016, "sec": 1})

                # Ders ücreti hesaplama türü seçim ekranına gelmesi beklenir.
                assert resp.json['forms']['schema'][
                           "title"] == u"Puantaj Tablosu Hesaplama Türü Seçiniz"

                # Tür seçildikten sonra ekrana Puantaj Tablosu çıkarılması beklenir.
                resp = self.client.post(form={"ek_ders": 'null', "ders": 1})
                assert "PUANTAJ TABLOSU" in resp.json['forms']['schema']["title"]

                # Kullanıcı adından öğretim görevlisinin adı soyadı bulunur.
                # Oluşturulan puantaj tablosunun doğru öğretim görevlisi adına
                # oluşturulup oluşturulmadığı kontrol edilir.
                okutman = user.personel.okutman
                okutman_adi = okutman.__unicode__()

                # Bir döneme denk geldiği kontrol edilir.
                donem_list = Donem.takvim_ayina_rastlayan_donemler(2016, 11)
                assert len(donem_list) == 1

                ders_etkinlik_list = doneme_gore_okutman_etkinlikleri(donem_list, okutman, False)

                # Etkinlik olan günlerin etkinlik listede olduğu kontrol edilir.
                for etkinlik in DersEtkinligi.objects.filter(donem=donem_list[0], okutman=okutman, ek_ders=False):
                    assert etkinlik.gun in ders_etkinlik_list[0]

                # Personel izin listesi getirilir.
                personel_izin_list = personel_izin_gunlerini_getir(okutman, 2016, 11)

                birim_unit = Unit.objects.get(yoksis_no=okutman.donemdeki_gorev_yeri(donem_list[0]))
                resmi_tatil_list = resmi_tatil_gunleri_getir(birim_unit,2016,5)
                assert 19 and 1 in resmi_tatil_list[0]

                tarih_araligi = ders_etkinligine_gore_tarih_araligi(donem_list, 2016, 11, birim_unit)
                resmi_tatil_list = resmi_tatil_gunleri_getir(birim_unit, 2016, 11)

                aylik_plan = okutman_aylik_plani(donem_list, ders_etkinlik_list,
                                    resmi_tatil_list, personel_izin_list,
                                    tarih_araligi,2016, 11)

                son_gun = yil_ve_aya_gore_ilk_ve_son_gun(2016, 11)[1].day

                for i in range(son_gun):
                    if resp.json['objects'][1]['fields'][" %i"%(i+1)]== ' ':
                        assert i+1 not in aylik_plan[0]
                    elif resp.json['objects'][1]['fields'][" %i"%(i+1)]== 'İ':
                        assert aylik_plan[0][i+1] == 'İ'
                    elif resp.json['objects'][1]['fields'][" %i"%(i+1)]== 'R':
                        assert aylik_plan[0][i+1] == 'R'
                    else:
                        hafta_gun = date(2016,11,i+1).isoweekday()

                        assert resp.json['objects'][1]['fields'][" %i"%(i+1)] == str(ders_etkinlik_list[0][hafta_gun])
                        assert resp.json['objects'][1]['fields'][" %i"%(i+1)] == str(aylik_plan[0][i+1])

                # Personel'in izin günlerinin doğru olup olmadığı test edilir.
                assert personel_izin_list == [16, 17, 18, 19, 20, 21]

                # Puantaj tablosu'nda öğretim görevlisinin isminin olduğu test edilir.
                assert okutman_adi.upper() in resp.json['forms']['schema']["title"].upper()
    def test_ders_ucreti_hesaplama(self):

        for loop in range(3):
            # mutemet kullanıcısıyla giriş yapılır.
            user = User.objects.get(username='******')
            # testi yazılacak iş akışı seçilir.
            self.prepare_client('/ders_ucreti_hesaplama', user=user)
            self.client.post()

            if loop == 0:
                for i in range(2):

                    # 2016 yılı Aralık ayı seçilir. Veritabanında seçilen yıl ve


                    #  ayı içeren dönem bulunmamaktadır. 'Dönem Bulunamadı' başlıklı
                    # hata mesajının çıkması beklenir.

                    resp = self.client.post(form={"ay_sec": 5, "yil_sec": 2013, "sec": 1})
                    assert resp.json['forms']['schema']["title"] == "Dönem Bulunamadı"

                    if i == 0:
                        # İlk döngüde hata mesajından sonra eğer geriye dönülmesi seçilirse,
                        # tarih seçme ekranına geri dönmesi beklenir.
                        resp = self.client.post(form={"iptal": "null", "geri_don": 1, "sec": 1}, flow="tarih_sec")
                        assert resp.json['forms']['schema'][
                                   "title"] == "Puantaj Tablosu Hazırlamak İstediğiniz Yıl ve Ayı Seçiniz"

                    if i == 1:
                        # Eğer iptal butonuna basılırsa, işlem iptali hakkında bilgilendirme
                        # mesajı çıkması beklenir.
                        resp = self.client.post(form={"iptal": 1, "geri_don": "null", "sec": 1},
                                                flow="islem_iptali_bilgilendir")
                        assert resp.json["msgbox"]["title"] == "Durum Mesajı" and "iptal" in resp.json["msgbox"]["msg"]

            if loop == 1:

                # Geçerli bir dönemin bulunduğu tarih seçildiğinde, mutemetin
                # işlem yaptığı birime ait öğretim görevlilerinin isimlerinin
                # olduğu bir form gelmesi beklenir.
                resp = self.client.post(form={"ay_sec": 11, "yil_sec": 2016, "sec": 1})
                assert resp.json['forms']['schema']["title"] == "Okutman Seçiniz"

                # Ekrana gelen öğretim görevlisi sayısıyla veritabanındaki sayının
                # aynı olması beklenir.
                birim_no = self.client.current.role.unit.yoksis_no
                assert len(resp.json['forms']['model']["OkutmanListesi"]) == len(
                    [o for o in Okutman.objects for gorev_birimi in o.GorevBirimi if
                     gorev_birimi.yoksis_no == birim_no and gorev_birimi.donem == Donem.guncel_donem()])

                okutman_listesi = resp.json['forms']['model']["OkutmanListesi"]

                # Varsayılan olarak tüm öğretim görevlileri seçili halde gelir.
                # Seçimleri kaldırılır.
                for i in range(len(okutman_listesi)):
                    okutman_listesi[i]['secim'] = False

                for i in range(2):
                    # Hiçbir öğretim görevlisi seçmeden ilerlemeye çalışıldığında, işlem
                    # yapacak öğretim görevlisi olmadığından hata mesajı göstermesi beklenir.
                    resp = self.client.post(form={"OkutmanListesi": okutman_listesi, "sec": 1})
                    assert resp.json['forms']['schema']["title"] == "Öğretim Görevlisi Seçmelisiniz"

                    if i == 0:
                        # İlk döngüde hata mesajından sonra eğer geriye dönülmesi seçilirse,
                        # öğretim görevlisi seçme ekranına geri dönmesi beklenir.
                        resp = self.client.post(form={"iptal": "null", "geri_don": 1, "sec": 1}, flow="okutman_sec")
                        assert resp.json['forms']['schema']["title"] == \
                               "Okutman Seçiniz"
                    if i == 1:
                        # Eğer iptal butonuna basılırsa, işlem iptali hakkında bilgilendirme
                        # mesajı çıkması beklenir.
                        resp = self.client.post(form={"iptal": 1, "geri_don": "null", "sec": 1},
                                                flow="islem_iptali_bilgilendir")
                        assert resp.json["msgbox"]["title"] == "Durum Mesajı" and "iptal" in resp.json["msgbox"]["msg"]

            if loop == 2:
                # Geçerli bir tarih ve öğretim görevlisi seçilmesi senaryosu.
                resp = self.client.post(form={"ay_sec": 5, "yil_sec": 2016, "sec": 1})
                okutman_listesi = resp.json['forms']['model']["OkutmanListesi"]

                for i in range(3):

                    birim_no = self.client.current.role.unit.yoksis_no
                    birim_unit = Unit.objects.get(yoksis_no=birim_no)

                    # 2016 yılı Şubat ayı verilir. Bahar dönemi ders başlangıcı 21 Şubat olduğu
                    # için tarih aralığının (21,29) olması kontrol edilir.
                    if i == 0:
                        donem_list = Donem.takvim_ayina_rastlayan_donemler(2016, 2)
                        assert len(donem_list) == 1

                        tarih_araligi = ders_etkinligine_gore_tarih_araligi(donem_list, 2016, 2, birim_unit)
                        assert tarih_araligi == [(21, 29)]

                    # 2016 yılı Temmuz ayı verilir. Temmuz ayı Bahar dönemi bitişi ve Yaz dönemi başlangıcıdır.
                    # 2 döneme denk gelir. Ama Temmuz ayında sadece yaz döneminin ders etkinlikleri vardır.
                    # 2 döneme rastlayıp sadece 1 dönemin ders etkinliklerine rastladığı için, tarih aralığının
                    # 2 tuple dan oluşması ve bir tanesinin birbirine eşit olması beklenir.
                    if i == 1:
                        donem_list = Donem.takvim_ayina_rastlayan_donemler(2016, 7)
                        assert len(donem_list) == 2

                        tarih_araligi = ders_etkinligine_gore_tarih_araligi(donem_list, 2016, 7, birim_unit)

                        assert tarih_araligi == [(1, 0), (15, 31)]


                    # 2016 yılı Mayıs ayı verilir. Mayıs ayı Bahar dönemine rastlar.
                    # 19 Mayıs ve 1 Mayıs'ın resmi tatil listesinde olması beklenir.
                    else:
                        donem_list = Donem.takvim_ayina_rastlayan_donemler(2016, 5)
                        assert len(donem_list) == 1
                        resmi_tatil_list = resmi_tatil_gunleri_getir(birim_unit, 2016, 5)

                        assert 19 and 1 in resmi_tatil_list[0]
                        tarih_araligi = ders_etkinligine_gore_tarih_araligi(donem_list, 2016, 5, birim_unit)

                        assert tarih_araligi == [(1, 31)]

                # Varsayılan olarak tüm öğretim görevlileri seçili olarak
                # gelmesini kontrol eder.
                for i in range(len(okutman_listesi)):
                    assert okutman_listesi[i]['secim'] == True

                # Hepsi seçili olarak bir sonraki adıma ilerlenir.
                resp = self.client.post(form={"OkutmanListesi": okutman_listesi, "sec": 1})

                # Ders ücreti hesaplama türü seçim ekranına gelmesi beklenir.
                assert resp.json['forms']['schema'][
                           "title"] == "Puantaj Tablosu Hesaplama Türü Seçiniz"

                resp = self.client.post(form={"ek_ders": 'null', "ders": 1})

                for j, okutman in enumerate(okutman_listesi):
                    okutman = Okutman.objects.get(okutman['key'])

                    ders_etkinlik_list = doneme_gore_okutman_etkinlikleri(donem_list, okutman, False)

                    # Etkinlik olan günlerin etkinlik listede olduğu kontrol edilir.
                    for etkinlik in DersEtkinligi.objects.filter(donem=donem_list[0], okutman=okutman, ek_ders=False):
                        assert etkinlik.gun in ders_etkinlik_list[0]

                    # Personel izin listesi getirilir.
                    personel_izin_list = personel_izin_gunlerini_getir(okutman, 2016, 5)

                    aylik_plan = okutman_aylik_plani(donem_list, ders_etkinlik_list,
                                                     resmi_tatil_list, personel_izin_list,
                                                     tarih_araligi, 2016, 5)

                    son_gun = yil_ve_aya_gore_ilk_ve_son_gun(2016, 5)[1].day

                    for i in range(son_gun):
                        if resp.json['objects'][j + 1]['fields'][" %i" % (i + 1)] == ' ':
                            assert i + 1 not in aylik_plan[0]
                        elif resp.json['objects'][j + 1]['fields'][" %i" % (i + 1)] == 'İ':
                            assert aylik_plan[0][i + 1] == 'İ'
                        elif resp.json['objects'][j + 1]['fields'][" %i" % (i + 1)] == 'R':
                            assert aylik_plan[0][i + 1] == 'R'
                        else:
                            hafta_gun = date(2016, 5, i + 1).isoweekday()

                            assert resp.json['objects'][j + 1]['fields'][" %i" % (i + 1)] == str(
                                ders_etkinlik_list[0][hafta_gun])
                            assert resp.json['objects'][j + 1]['fields'][" %i" % (i + 1)] == str(aylik_plan[0][i + 1])

                    # Tür seçildikten sonra ekrana Puantaj Tablosu çıkarılması beklenir.
                    assert "PUANTAJ TABLOSU" in resp.json['forms']['schema']["title"]
Example #4
0
    def ucret_hesapla(self):
        """
        Seçilen ay ve yıla göre, seçilen her bir öğretim elemanının
        resmi tatil ve izinleri dikkate alarak aylık ders saati planlamasını
        yapar
        """
        # Ders seçim türüne göre ayarlamalar yapılır.
        ek_ders, ders_turu = (
            True, 'Ek') if self.input['form']['ek_ders'] == 1 else (False, '')

        yil = self.current.task_data["yil"]  # girilen yil
        ay = self.current.task_data["ay"]  # girilen ayin orderi
        ay_isim = self.current.task_data["ay_isim"]  # ayin adi

        # verilen ayın son gunu bulunur 28,31 gibi
        ilk, son = yil_ve_aya_gore_ilk_ve_son_gun(yil, ay)
        ayin_son_gunu = son.day

        birim_unit = self.current.role.unit

        # Secilen ay hangi donemleri kapsiyor, kac donemi kapsıyorsa
        # o donemleri dondürür.
        donem_list = Donem.takvim_ayina_rastlayan_donemler(yil, ay)

        # Resmi tatillerin gununu (23, 12, 8) gibi döndürür.
        resmi_tatil_list = resmi_tatil_gunleri_getir(birim_unit, yil, ay)

        # Kapsadığı dönemlere göre ders baslangıc ve bitis tarihlerini
        # baz alarak kapsadığı her bir dönemin seçilen ayda hangi gün
        # aralıklarını kapsadığı bilgisini tuple olarak dondurur. Bir
        # dönemi kapsıyorsa bir tuple, iki dönemi kapsıyorsa iki tuple
        # döner. (1,12) (19,31) gibi
        tarih_araligi = ders_etkinligine_gore_tarih_araligi(
            donem_list, yil, ay, birim_unit)

        table_head = ['Öğretim Elemanı']
        table_head.extend([str(d) for d in range(1, ayin_son_gunu + 1)])
        table_head.append('Toplam')

        self.output['objects'] = [table_head]

        # Seçilen okutmanların bulunmaması demek,
        title = _(
            u"%(baslik)s %(yil)s-%(ay)s AYI %(ders)s DERS PUANTAJ TABLOSU") % {
                'baslik': self.current.task_data["title"],
                'yil': yil,
                'ay': ay_isim.upper(),
                'ders': ders_turu.upper(),
            }

        _form = PuantajFormu(title=title)
        self.form_out(_form)

        for secilen_okutman in self.current.task_data["secilen_okutmanlar"]:
            okutman = Okutman.objects.get(secilen_okutman['key'])

            # Seçilen okutmanın İzin ve Ücretsiz İzinlerini dikkate alarak, verilen ayda
            # hangi günler izinli olduğunu liste halinde döndürmeye yarayan method
            # [17,18,19] gibi
            personel_izin_list = personel_izin_gunlerini_getir(
                okutman, yil, ay)

            # Verilen döneme ve okutmana göre, haftada hangi gün kaç saat dersi
            # (seçilen seçeneğe göre ders veya ek ders) olduğunu gösteren
            # dictionarylerden oluşan liste, seçilen yıl ve ay bir dönemi kapsıyorsa
            # bir dict, iki dönemi kapsıyorsa iki dict döner.
            ders_etkinlik_list = doneme_gore_okutman_etkinlikleri(
                donem_list, okutman, ek_ders)

            # Bulunan tarih araliklarina, okutmanın aylık ders etkinliklerine göre
            # ayın hangi gününde dersi varsa kaç saat dersi olduğu bilgisi,
            # izinliyse İ, resmi tatilse R bilgisini bir dictionary e doldurur.
            okutman_aylik_plan, ders_saati = okutman_aylik_plani(
                donem_list, ders_etkinlik_list, resmi_tatil_list,
                personel_izin_list, tarih_araligi, yil, ay)

            # Okutmanın oluşturulan bilgilerinin ekrana basılacağı şeklinin oluşturulması
            okutman_bilgi_listesi = okutman_bilgileri_doldur(
                okutman, ayin_son_gunu, okutman_aylik_plan, ders_saati)

            item = {
                "type": "table-multiRow",
                "fields": okutman_bilgi_listesi,
                "actions": False,
            }

            self.output['objects'].append(item)
    def ucret_hesapla(self):
        """
        Seçilen ay ve yıla göre, seçilen her bir öğretim elemanının
        resmi tatil ve izinleri dikkate alarak aylık ders saati planlamasını
        yapar
        """
        # Ders seçim türüne göre ayarlamalar yapılır.
        ek_ders, ders_turu = (True, 'Ek') if self.input['form']['ek_ders'] == 1 else (False, '')

        yil = self.current.task_data["yil"]  # girilen yil
        ay = self.current.task_data["ay"]  # girilen ayin orderi
        ay_isim = self.current.task_data["ay_isim"]  # ayin adi

        # verilen ayın son gunu bulunur 28,31 gibi
        ilk, son = yil_ve_aya_gore_ilk_ve_son_gun(yil, ay)
        ayin_son_gunu = son.day

        birim_unit = self.current.role.unit

        # Secilen ay hangi donemleri kapsiyor, kac donemi kapsıyorsa
        # o donemleri dondürür.
        donem_list = Donem.takvim_ayina_rastlayan_donemler(yil, ay)

        # Resmi tatillerin gununu (23, 12, 8) gibi döndürür.
        resmi_tatil_list = resmi_tatil_gunleri_getir(birim_unit, yil, ay)

        # Kapsadığı dönemlere göre ders baslangıc ve bitis tarihlerini
        # baz alarak kapsadığı her bir dönemin seçilen ayda hangi gün
        # aralıklarını kapsadığı bilgisini tuple olarak dondurur. Bir
        # dönemi kapsıyorsa bir tuple, iki dönemi kapsıyorsa iki tuple
        # döner. (1,12) (19,31) gibi
        tarih_araligi = ders_etkinligine_gore_tarih_araligi(donem_list, yil, ay, birim_unit)

        table_head = ['Öğretim Elemanı']
        table_head.extend([str(d) for d in range(1, ayin_son_gunu + 1)])
        table_head.append('Toplam')

        self.output['objects'] = [table_head]

        # Seçilen okutmanların bulunmaması demek,
        title = _(u"%(baslik)s %(yil)s-%(ay)s AYI %(ders)s DERS PUANTAJ TABLOSU") % {
            'baslik': self.current.task_data["title"],
            'yil': yil,
            'ay': ay_isim.upper(),
            'ders': ders_turu.upper(),
        }

        _form = PuantajFormu(title=title)
        self.form_out(_form)

        for secilen_okutman in self.current.task_data["secilen_okutmanlar"]:
            okutman = Okutman.objects.get(secilen_okutman['key'])

            # Seçilen okutmanın İzin ve Ücretsiz İzinlerini dikkate alarak, verilen ayda
            # hangi günler izinli olduğunu liste halinde döndürmeye yarayan method
            # [17,18,19] gibi
            personel_izin_list = personel_izin_gunlerini_getir(okutman, yil, ay)

            # Verilen döneme ve okutmana göre, haftada hangi gün kaç saat dersi
            # (seçilen seçeneğe göre ders veya ek ders) olduğunu gösteren
            # dictionarylerden oluşan liste, seçilen yıl ve ay bir dönemi kapsıyorsa
            # bir dict, iki dönemi kapsıyorsa iki dict döner.
            ders_etkinlik_list = doneme_gore_okutman_etkinlikleri(donem_list, okutman, ek_ders)

            # Bulunan tarih araliklarina, okutmanın aylık ders etkinliklerine göre
            # ayın hangi gününde dersi varsa kaç saat dersi olduğu bilgisi,
            # izinliyse İ, resmi tatilse R bilgisini bir dictionary e doldurur.
            okutman_aylik_plan, ders_saati = okutman_aylik_plani(donem_list, ders_etkinlik_list,
                                                                 resmi_tatil_list,
                                                                 personel_izin_list,
                                                                 tarih_araligi, yil, ay)

            # Okutmanın oluşturulan bilgilerinin ekrana basılacağı şeklinin oluşturulması
            okutman_bilgi_listesi = okutman_bilgileri_doldur(okutman, ayin_son_gunu,
                                                             okutman_aylik_plan, ders_saati)

            item = {
                "type": "table-multiRow",
                "fields": okutman_bilgi_listesi,
                "actions": False,
            }

            self.output['objects'].append(item)
    def test_ders_ucreti_hesaplama(self):

        for loop in range(3):
            # mutemet kullanıcısıyla giriş yapılır.
            user = User.objects.get(username='******')
            # testi yazılacak iş akışı seçilir.
            self.prepare_client('/ders_ucreti_hesaplama', user=user)
            self.client.post()

            if loop == 0:
                for i in range(2):

                    # 2016 yılı Aralık ayı seçilir. Veritabanında seçilen yıl ve

                    #  ayı içeren dönem bulunmamaktadır. 'Dönem Bulunamadı' başlıklı
                    # hata mesajının çıkması beklenir.

                    resp = self.client.post(form={
                        "ay_sec": 5,
                        "yil_sec": 2013,
                        "sec": 1
                    })
                    assert resp.json['forms']['schema'][
                        "title"] == "Dönem Bulunamadı"

                    if i == 0:
                        # İlk döngüde hata mesajından sonra eğer geriye dönülmesi seçilirse,
                        # tarih seçme ekranına geri dönmesi beklenir.
                        resp = self.client.post(form={
                            "iptal": "null",
                            "geri_don": 1,
                            "sec": 1
                        },
                                                flow="tarih_sec")
                        assert resp.json['forms']['schema'][
                            "title"] == "Puantaj Tablosu Hazırlamak İstediğiniz Yıl ve Ayı Seçiniz"

                    if i == 1:
                        # Eğer iptal butonuna basılırsa, işlem iptali hakkında bilgilendirme
                        # mesajı çıkması beklenir.
                        resp = self.client.post(
                            form={
                                "iptal": 1,
                                "geri_don": "null",
                                "sec": 1
                            },
                            flow="islem_iptali_bilgilendir")
                        assert resp.json["msgbox"][
                            "title"] == "Durum Mesajı" and "iptal" in resp.json[
                                "msgbox"]["msg"]

            if loop == 1:

                # Geçerli bir dönemin bulunduğu tarih seçildiğinde, mutemetin
                # işlem yaptığı birime ait öğretim görevlilerinin isimlerinin
                # olduğu bir form gelmesi beklenir.
                resp = self.client.post(form={
                    "ay_sec": 11,
                    "yil_sec": 2016,
                    "sec": 1
                })
                assert resp.json['forms']['schema'][
                    "title"] == "Okutman Seçiniz"

                # Ekrana gelen öğretim görevlisi sayısıyla veritabanındaki sayının
                # aynı olması beklenir.
                birim_no = self.client.current.role.unit.yoksis_no
                assert len(
                    resp.json['forms']['model']["OkutmanListesi"]) == len([
                        o for o in Okutman.objects
                        for gorev_birimi in o.GorevBirimi
                        if gorev_birimi.yoksis_no == birim_no
                        and gorev_birimi.donem == Donem.guncel_donem()
                    ])

                okutman_listesi = resp.json['forms']['model']["OkutmanListesi"]

                # Varsayılan olarak tüm öğretim görevlileri seçili halde gelir.
                # Seçimleri kaldırılır.
                for i in range(len(okutman_listesi)):
                    okutman_listesi[i]['secim'] = False

                for i in range(2):
                    # Hiçbir öğretim görevlisi seçmeden ilerlemeye çalışıldığında, işlem
                    # yapacak öğretim görevlisi olmadığından hata mesajı göstermesi beklenir.
                    resp = self.client.post(form={
                        "OkutmanListesi": okutman_listesi,
                        "sec": 1
                    })
                    assert resp.json['forms']['schema'][
                        "title"] == "Öğretim Görevlisi Seçmelisiniz"

                    if i == 0:
                        # İlk döngüde hata mesajından sonra eğer geriye dönülmesi seçilirse,
                        # öğretim görevlisi seçme ekranına geri dönmesi beklenir.
                        resp = self.client.post(form={
                            "iptal": "null",
                            "geri_don": 1,
                            "sec": 1
                        },
                                                flow="okutman_sec")
                        assert resp.json['forms']['schema']["title"] == \
                               "Okutman Seçiniz"
                    if i == 1:
                        # Eğer iptal butonuna basılırsa, işlem iptali hakkında bilgilendirme
                        # mesajı çıkması beklenir.
                        resp = self.client.post(
                            form={
                                "iptal": 1,
                                "geri_don": "null",
                                "sec": 1
                            },
                            flow="islem_iptali_bilgilendir")
                        assert resp.json["msgbox"][
                            "title"] == "Durum Mesajı" and "iptal" in resp.json[
                                "msgbox"]["msg"]

            if loop == 2:
                # Geçerli bir tarih ve öğretim görevlisi seçilmesi senaryosu.
                resp = self.client.post(form={
                    "ay_sec": 5,
                    "yil_sec": 2016,
                    "sec": 1
                })
                okutman_listesi = resp.json['forms']['model']["OkutmanListesi"]

                for i in range(3):

                    birim_no = self.client.current.role.unit.yoksis_no
                    birim_unit = Unit.objects.get(yoksis_no=birim_no)

                    # 2016 yılı Şubat ayı verilir. Bahar dönemi ders başlangıcı 21 Şubat olduğu
                    # için tarih aralığının (21,29) olması kontrol edilir.
                    if i == 0:
                        donem_list = Donem.takvim_ayina_rastlayan_donemler(
                            2016, 2)
                        assert len(donem_list) == 1

                        tarih_araligi = ders_etkinligine_gore_tarih_araligi(
                            donem_list, 2016, 2, birim_unit)
                        assert tarih_araligi == [(21, 29)]

                    # 2016 yılı Temmuz ayı verilir. Temmuz ayı Bahar dönemi bitişi ve Yaz dönemi başlangıcıdır.
                    # 2 döneme denk gelir. Ama Temmuz ayında sadece yaz döneminin ders etkinlikleri vardır.
                    # 2 döneme rastlayıp sadece 1 dönemin ders etkinliklerine rastladığı için, tarih aralığının
                    # 2 tuple dan oluşması ve bir tanesinin birbirine eşit olması beklenir.
                    if i == 1:
                        donem_list = Donem.takvim_ayina_rastlayan_donemler(
                            2016, 7)
                        assert len(donem_list) == 2

                        tarih_araligi = ders_etkinligine_gore_tarih_araligi(
                            donem_list, 2016, 7, birim_unit)

                        assert tarih_araligi == [(1, 0), (15, 31)]

                    # 2016 yılı Mayıs ayı verilir. Mayıs ayı Bahar dönemine rastlar.
                    # 19 Mayıs ve 1 Mayıs'ın resmi tatil listesinde olması beklenir.
                    else:
                        donem_list = Donem.takvim_ayina_rastlayan_donemler(
                            2016, 5)
                        assert len(donem_list) == 1
                        resmi_tatil_list = resmi_tatil_gunleri_getir(
                            birim_unit, 2016, 5)

                        assert 19 and 1 in resmi_tatil_list[0]
                        tarih_araligi = ders_etkinligine_gore_tarih_araligi(
                            donem_list, 2016, 5, birim_unit)

                        assert tarih_araligi == [(1, 31)]

                # Varsayılan olarak tüm öğretim görevlileri seçili olarak
                # gelmesini kontrol eder.
                for i in range(len(okutman_listesi)):
                    assert okutman_listesi[i]['secim'] == True

                # Hepsi seçili olarak bir sonraki adıma ilerlenir.
                resp = self.client.post(form={
                    "OkutmanListesi": okutman_listesi,
                    "sec": 1
                })

                # Ders ücreti hesaplama türü seçim ekranına gelmesi beklenir.
                assert resp.json['forms']['schema'][
                    "title"] == "Puantaj Tablosu Hesaplama Türü Seçiniz"

                resp = self.client.post(form={"ek_ders": 'null', "ders": 1})

                for j, okutman in enumerate(okutman_listesi):
                    okutman = Okutman.objects.get(okutman['key'])

                    ders_etkinlik_list = doneme_gore_okutman_etkinlikleri(
                        donem_list, okutman, False)

                    # Etkinlik olan günlerin etkinlik listede olduğu kontrol edilir.
                    for etkinlik in DersEtkinligi.objects.filter(
                            donem=donem_list[0], okutman=okutman,
                            ek_ders=False):
                        assert etkinlik.gun in ders_etkinlik_list[0]

                    # Personel izin listesi getirilir.
                    personel_izin_list = personel_izin_gunlerini_getir(
                        okutman, 2016, 5)

                    aylik_plan = okutman_aylik_plani(donem_list,
                                                     ders_etkinlik_list,
                                                     resmi_tatil_list,
                                                     personel_izin_list,
                                                     tarih_araligi, 2016, 5)

                    son_gun = yil_ve_aya_gore_ilk_ve_son_gun(2016, 5)[1].day

                    for i in range(son_gun):
                        if resp.json['objects'][j +
                                                1]['fields'][" %i" %
                                                             (i + 1)] == ' ':
                            assert i + 1 not in aylik_plan[0]
                        elif resp.json['objects'][j +
                                                  1]['fields'][" %i" %
                                                               (i + 1)] == 'İ':
                            assert aylik_plan[0][i + 1] == 'İ'
                        elif resp.json['objects'][j +
                                                  1]['fields'][" %i" %
                                                               (i + 1)] == 'R':
                            assert aylik_plan[0][i + 1] == 'R'
                        else:
                            hafta_gun = date(2016, 5, i + 1).isoweekday()

                            assert resp.json['objects'][j + 1]['fields'][
                                " %i" % (i + 1)] == str(
                                    ders_etkinlik_list[0][hafta_gun])
                            assert resp.json['objects'][j + 1]['fields'][
                                " %i" % (i + 1)] == str(aylik_plan[0][i + 1])

                    # Tür seçildikten sonra ekrana Puantaj Tablosu çıkarılması beklenir.
                    assert "PUANTAJ TABLOSU" in resp.json['forms']['schema'][
                        "title"]