class SatinalmaBelgelerView(FlaskView):
    @staticmethod
    @login_required
    @auth.requires(
        Permission(*permission_dict["bap"]["satinalma"]
                   ["satinalma_belgeleri_goruntuleme"]),
        Or(Role('BAP Yetkilisi'), Role('BAP Admin')))
    @route("<int:satinalma_id>/belgeler",
           methods=["GET", "POST"],
           endpoint="satinalma_belgeler")
    def satinalma_ozet(satinalma_id):

        satinalma = get_satinalma_with_related_fields(
            satinalma_id=satinalma_id)
        states_info = get_satinalma_next_states_info(satinalma_id=satinalma_id)
        actions_info = get_satinalma_actions_info(satinalma_id=satinalma_id)
        proje = DB.session.query(Proje).filter(
            Proje.id == satinalma.proje_id).first()
        templates = get_templates_info(satinalma_id=satinalma_id)

        return render_template("satinalma_dashboard/satinalma_belgeler.html",
                               satinalma=satinalma,
                               satinalma_id=satinalma_id,
                               proje=proje,
                               actions_info=actions_info,
                               states_info=states_info,
                               templates=templates)
Exemple #2
0
class ProjeNotlariView(FlaskView):
    """
    Proje Notlari
    """
    @staticmethod
    @login_required
    @auth.requires(
        Permission(*permission_dict["bap"]["proje"]["dashboard"]
                   ["proje_notlari_goruntuleme"]),
        Or(ProjeYurutucusu(), Role('BAP Yetkilisi'), Role('BAP Admin')))
    @route("<int:proje_id>/dashboard/notlar",
           methods=["GET"],
           endpoint="proje_notlari")
    def proje_notlari(proje_id):
        """
        projeye eklenen özel notları görüntüler
        Args:
            proje_id(int): projenin id si

        Returns:

        """
        proje = DB.session.query(Proje).options(
            joinedload(Proje.proje_yurutucu).load_only("id").joinedload(
                OgretimElemani.personel).load_only("id").joinedload(
                    Personel.person).load_only("ad", "soyad"),
            lazyload(Proje.proje_detayi),
            lazyload(Proje.kabul_edilen_proje_hakemleri),
            lazyload(Proje.proje_hakem_onerileri),
            lazyload(Proje.proje_destekleyen_kurulus),
            lazyload(Proje.proje_kalemleri),
        ).filter(
            Proje.id == proje_id,
            or_(
                Proje.proje_basvuru_durumu == ProjeBasvuruDurumu.tamamlandi,
                Proje.proje_basvuru_durumu ==
                ProjeBasvuruDurumu.revizyon_bekleniyor)).first()
        next_states_info = get_next_states_info(proje_id=proje_id)
        actions_info = get_actions_info(proje_id=proje_id)

        proje_yurutucusu_mu = ProjeYurutucusu().fulfill(user=current_user)
        proje_notlari = DB.session.query(
            ProjeNot, Person.ad.label("ad"),
            Person.soyad.label("soyad")).filter(
                ProjeNot.proje_id == proje_id).join(
                    Person,
                    Person.user_id == ProjeNot.notu_ekleyen_yetkili).all()

        if not proje:
            pass
            # todo: proje bulunamadı hatası dön

        return render_template("dashboard/proje_notlari.html",
                               proje=proje,
                               next_states_info=next_states_info,
                               proje_yurutucusu_mu=proje_yurutucusu_mu,
                               actions_info=actions_info,
                               proje_notlari=proje_notlari,
                               proje_id=proje.id)
def use_permission():
    with Permission(
            Or(
                HasLevel(AuthLevels.admin),
                HasLevel(AuthLevels.staff),
                And(HasLevel(AuthLevels.user), HasPermission("promote")),
            )):
        pass
    return "thumbs up"
Exemple #4
0
class ProjeKararlariView(FlaskView):
    """Proje kararları listeleme"""
    @staticmethod
    @login_required
    @auth.requires(
        And(
            Permission(*permission_dict["bap"]["proje"]["dashboard"]
                       ["proje_kararlari_goruntuleme"]),
            Or(ProjeYurutucusu(), Role('BAP Yetkilisi'), Role("BAP Admin"))))
    @route('<int:proje_id>/dashboard/karar',
           methods=["GET"],
           endpoint='proje_kararlari_listele')
    def proje_kararlari(proje_id):
        """Yönetim Kurulu Kararları Listesi Ekrani"""
        proje_yurutucusu_mu = ProjeYurutucusu().fulfill(user=current_user)

        proje = DB.session.query(Proje).options(
            joinedload(Proje.proje_yurutucu).load_only("id").joinedload(
                OgretimElemani.personel).load_only("id").joinedload(
                    Personel.person).load_only("ad", "soyad"),
            lazyload(Proje.proje_detayi),
            lazyload(Proje.kabul_edilen_proje_hakemleri),
            lazyload(Proje.proje_hakem_onerileri),
            lazyload(Proje.proje_destekleyen_kurulus),
            lazyload(Proje.proje_kalemleri),
        ).filter(
            Proje.id == proje_id,
            or_(
                Proje.proje_basvuru_durumu == ProjeBasvuruDurumu.tamamlandi,
                Proje.proje_basvuru_durumu ==
                ProjeBasvuruDurumu.revizyon_bekleniyor)).first()

        next_states_info = get_next_states_info(proje_id=proje_id)
        actions_info = get_actions_info(proje_id=proje_id)
        try:
            karar_listesi = DB.session.query(BapGundem).filter(
                BapGundem.proje_id == proje_id,
                BapGundem.karar_durum != KararDurumu.degerlendirilmedi)
        except SQLAlchemyError as exc:
            CustomErrorHandler.error_handler(
                hata="Proje kararları sorgusunda hata oluştu  "
                "Hata: {}, User id: {}, Proje id: {}".format(
                    exc, current_user.id, proje_id))

            return abort(500)

        return render_template("dashboard/proje_kararlari.html",
                               karar_listesi=karar_listesi,
                               proje_id=proje_id,
                               proje=proje,
                               next_states_info=next_states_info,
                               actions_info=actions_info,
                               proje_yurutucusu_mu=proje_yurutucusu_mu)
Exemple #5
0
class SatinalmaIslemGecmisiListesiView(FlaskView):
    """
        Satinalma islem gecmisini listeleyen view
    """

    @login_required
    @auth.requires(
        Or(Permission(*permission_dict["bap"]["satinalma"]["satinalma_islem_gecmisi_goruntuleme"]),
           RoleReq('BAP Yetkilisi'), RoleReq("BAP Admin")))
    @route('/<int:satinalma_id>/islem-gecmisi', methods=['GET'],
           endpoint='satinalma_islem_gecmisi_listele')
    def satinalma_islem_gecmisi(self, satinalma_id):
        """
        Satinalma islem gecmisine ulasmak icin kullanilir
        :param satinalma_id: satinalma_id(int)
        :return: http response
        """
        params = {"satinalma_id": satinalma_id}

        try:
            satinalma = get_satinalma_with_related_fields(satinalma_id=satinalma_id)
            states_info = get_satinalma_next_states_info(satinalma_id=satinalma_id)
            actions_info = get_satinalma_actions_info(satinalma_id=satinalma_id)
            proje = DB.session.query(Proje).filter(Proje.id == satinalma.proje_id).first()

            islem_listesi = DB.session.query(AppStateTracker). \
                filter(AppStateTracker.params.contains(params),
                       or_(AppStateTracker.job_type == JobTypes.satinalma_state_change,
                            AppStateTracker.job_type == JobTypes.satinalma_action)). \
                       join(Person, Person.user_id == AppStateTracker.triggered_by). \
                       join(AppState, AppStateTracker.state_id == AppState.id). \
                       add_columns(
                           AppState.state_code.label("state_code"),
                           Person.ad.label("person_ad"),
                           Person.soyad.label("person_soyad"),
                       ).all()

        except Exception as exc:
            CustomErrorHandler.error_handler(
                                             hata="Satinalma işlem geçmişi görüntülenirken hata oluştu."
                                                  "Hata: {}, Satinalma id: {}".format(satinalma_id,
                                                                                      exc)
                                             )
            return abort(500)

        return render_template("satinalma_dashboard/satinalma_yapilan_islemler.html",
                               islem_listesi=islem_listesi,
                               satinalma=satinalma,
                               satinalma_id=satinalma_id,
                               proje=proje,
                               actions_info=actions_info,
                               states_info=states_info)
Exemple #6
0
class YollukView(FlaskView):
    """Toplanti Gundem Viewi"""

    @staticmethod
    @login_required
    @auth.requires(Or(Permission(*permission_dict["bap"]["toplanti"]["toplanti_gundemi_listeleme"]),
                      Role("BAP Yetkilisi"),
                      Role("BAP Admin")),
                   menu_registry={'path': '.bap.yolluk.yolluk_arama',
                                  'title': _("Yolluk")})
    @route("/yolluk", methods=['GET'])
    def yolluk():
        return render_template("yolluk.html")
Exemple #7
0
class MuhasebeFisleriView(FlaskView):
    """Bap Bütçe Kodları view classi"""
    @staticmethod
    @login_required
    @route('/liste', methods=['GET'])
    @auth.requires(Permission(
        *permission_dict["bap"]["butce"]["muhasebe_fisleri_goruntuleme"]),
                   menu_registry={
                       "path": ".bap.butce.muhasebe_fisleri",
                       "title": _("Muhasebe Fişleri")
                   })
    def butce_kodlari_goruntuleme_listele():
        # todo: monkey patch !!!
        # todo: server side yapilacak
        muhasebe_fisleri = DB.session.query(MuhasebeFisi).all()
        return render_template("muhasebe_fisleri_listeleme.html",
                               muhasebe_fisleri=muhasebe_fisleri)

    @login_required
    @auth.requires(
        Permission(
            *permission_dict["bap"]["butce"]["muhasebe_fisleri_goruntuleme"]),
        Or(RoleReq('BAP Yetkilisi'), RoleReq("BAP Admin")))
    @route('/muhasebe-fisi/<int:muhasebe_fis_id>', methods=['GET'])
    def get_odeme_emri(self, muhasebe_fis_id):
        """
        Odeme emri sablonunu ilgili muhasebe fisi alanlari ile render edip kullaniciya doner
        """
        try:
            muhasebe_fisi_data = BapQueryHelpers.get_muhasebe_fisi_bilgileri(
                muhasebe_fis_id)
            # sablon tipi id 49 --> Ödeme Emri Şablonu
            odeme_emri_sablonu = DB.session.query(Sablon).filter(
                Sablon.sablon_tipi_id == 49,
                Sablon.kullanilabilir_mi == True).order_by(
                    desc(Sablon.updated_at)).first()
            muhasebe_fisi = DB.session.query(MuhasebeFisi).filter(
                MuhasebeFisi.id == muhasebe_fis_id).first()
            muhasebe_fisi.odeme_emri_tamamlandi = True
            DB.session.commit()
            return render_template_string(odeme_emri_sablonu.sablon_text,
                                          data=muhasebe_fisi_data)

        except Exception as exc:
            DB.session.rollback()
            CustomErrorHandler.error_handler(
                hata="Muhasebe fişi ödeme emrine çevrilirken bir hata "
                "oluştu.Hata: {}, Muhasebe Fisi id: {}".format(
                    muhasebe_fis_id, exc))
            return abort(500)
Exemple #8
0
def can_post_reply(user, topic=None):
    kwargs = {}

    if isinstance(topic, int):
        kwargs["topic_id"] = topic
    elif isinstance(topic, Topic):
        kwargs["topic"] = topic

    return Permission(
        Or(
            IsAtleastSuperModerator,
            IsModeratorInForum(),
            And(Has("postreply"), TopicNotLocked(**kwargs)),
        ),
        identity=user,
    )
Exemple #9
0
def can_post_topic(user, forum):
    kwargs = {}

    if isinstance(forum, int):
        kwargs["forum_id"] = forum
    elif isinstance(forum, Forum):
        kwargs["forum"] = forum

    return Permission(
        Or(
            IsAtleastSuperModerator,
            IsModeratorInForum(**kwargs),
            And(Has("posttopic"), ForumNotLocked(**kwargs)),
        ),
        identity=user,
    )
Exemple #10
0
def can_delete_topic(user, topic=None):
    kwargs = {}

    if isinstance(topic, int):
        kwargs["topic_id"] = topic
    elif isinstance(topic, Topic):
        kwargs["topic"] = topic

    return Permission(
        Or(
            IsAtleastSuperModerator,
            And(IsModeratorInForum(), Has("deletetopic")),
            And(IsSameUser(), Has("deletetopic"), TopicNotLocked(**kwargs)),
        ),
        identity=user,
    )
Exemple #11
0
def can_edit_post(user, topic_or_post=None):
    kwargs = {}

    if isinstance(topic_or_post, int):
        kwargs["topic_id"] = topic_or_post
    elif isinstance(topic_or_post, Topic):
        kwargs["topic"] = topic_or_post
    elif isinstance(topic_or_post, Post):
        kwargs["post"] = topic_or_post

    return Permission(
        Or(
            IsAtleastSuperModerator,
            And(IsModeratorInForum(), Has("editpost")),
            And(
                IsSameUser(topic_or_post),
                Has("editpost"),
                TopicNotLocked(**kwargs),
            ),
        ),
        identity=user,
    )
Exemple #12
0
class TeslimBeklenenFirmalarView(FlaskView):
    """Bap Satinalma Teslim Beklenen Firmalar view class"""

    excluded_methods = ["qry"]

    def kalan_gun_sayisi(self, teslim_edilmesi_beklenen_tarih):
        kalan_gun = (datetime(teslim_edilmesi_beklenen_tarih.year,
                              teslim_edilmesi_beklenen_tarih.month,
                              teslim_edilmesi_beklenen_tarih.day) -
                     datetime.now()).days
        if kalan_gun < 0:
            return ("{} Gün geçti".format(abs(kalan_gun)), kalan_gun)

        return ("{} Gün kaldı".format(kalan_gun), kalan_gun)

    @property
    def qry(self):
        """
                Proje ve ilgili alanlari icin query nesnesi olustur.
                Returns:
                """
        return DB.session.query(BapFirma). \
            join(FirmaSatinalmaTeklif, FirmaSatinalmaTeklif.firma_id == BapFirma.id). \
            join(FirmaTeklifKalemi, FirmaTeklifKalemi.teklif_id == FirmaSatinalmaTeklif.id). \
            join(ProjeSatinAlmaTalebi, ProjeSatinAlmaTalebi.id == FirmaSatinalmaTeklif.satinalma_id). \
            join(TalepKalemleri, TalepKalemleri.satinalma_id == ProjeSatinAlmaTalebi.id). \
            join(SiparisTakip, SiparisTakip.satinalma_talep_kalemleri_id == TalepKalemleri.id). \
            join(Proje, Proje.id == ProjeSatinAlmaTalebi.proje_id). \
            join(OgretimElemani, Proje.yurutucu == OgretimElemani.id). \
            join(Personel, OgretimElemani.personel_id == Personel.id). \
            join(Person, Person.id == Personel.person_id). \
            join(HitapUnvan, Personel.unvan == HitapUnvan.id). \
            add_columns(
            BapFirma.adi.label("firma_adi"),
            Proje.proje_no.label("proje_no"),
            SiparisTakip.siparis_numarasi.label("siparis_no"),
            SiparisTakip.siparis_tarihi.label("siparis_tarihi"),
            SiparisTakip.teslim_edilmesi_beklenen_tarih.label("teslim_edilmesi_beklenen_tarih"),
            Person.ad.label("ad"),
            Person.ad.label("soyad"),
            HitapUnvan.ad.label("unvan"),
            ProjeSatinAlmaTalebi.id.label("satinalma_id"),
            FirmaTeklifKalemi.teslimat_suresi.label("teslimat_suresi")
        ). \
            filter(SiparisTakip.siparis_durumu == SiparisDurumu.firma_bekleniyor)

    def process_data(self, result, form_data, total_record):
        data = [[
            index + 1, r.firma_adi, r.proje_no if r.proje_no else '-',
            r.siparis_no, "{} {} {}".format(r.unvan, r.ad, r.soyad),
            '{}'.format(
                r.siparis_tarihi.strftime(current_app.config['DATE_FORMAT'])),
            '{}'.format(
                r.teslim_edilmesi_beklenen_tarih.strftime(
                    current_app.config['DATE_FORMAT'])),
            "{}".format(
                self.kalan_gun_sayisi(r.teslim_edilmesi_beklenen_tarih)[0]),
            """
            <a class="detail_arrow" href="{}"><span class="fa fa-arrow-circle-right fa-2x "></span>
                </a>
                """.format(
                url_for('satinalma.satinalma_dashboard',
                        satinalma_id=r.satinalma_id))
        ] for index, r in enumerate(result)]

        return jsonify({
            "data": data,
            "draw": form_data['draw'],
            "recordsFiltered": total_record,
            "recordsTotal": total_record
        })

    @staticmethod
    @login_required
    @route('/', methods=['GET'])
    @auth.requires(
        Permission(*permission_dict["bap"]["satinalma"]
                   ["teslimi_beklenen_firmalar_listesi_görüntüleme"]),
        menu_registry={
            "path": ".bap.satinalma.teslim_beklenen_firmalar",
            "title": _("Ürün Teslim Takibi")
        })
    def teslimi_beklenen_firmalar_listele():
        search_form = TeslimiBeklenenFirmalarSearchForm()
        return render_template("teslimi_beklenen_firmalar.html",
                               form=search_form)

    @login_required
    @auth.requires(
        Or(
            Permission(*permission_dict["bap"]["satinalma"]
                       ["teslimi_beklenen_firmalar_listesi_görüntüleme"]),
            Or(Role("BAP Admin"), Role("BAP Yetkilisi"))))
    @route('/data',
           methods=["POST"],
           endpoint="teslim_beklenen_firmalar_search")
    def teslimi_beklenen_firmalar_ara(self):  # pylint: disable=too-many-branches
        """
        Bap projelerinde POST ile gelen parametrelere gore arama yapip, sonuclari dondurur.
        Returns:
            http response
        """

        qry = self.qry
        total_record = qry.count()
        form_data = request.form.to_dict()
        search_form = TeslimiBeklenenFirmalarSearchForm(**form_data)

        if search_form.gun_gecikmesi.data == '1':
            qry = qry.filter(
                SiparisTakip.teslim_edilmesi_beklenen_tarih > date.today())

        elif search_form.gun_gecikmesi.data == '2':
            qry = qry.filter(
                SiparisTakip.teslim_edilmesi_beklenen_tarih < date.today())

        elif search_form.gun_gecikmesi.data == '3':
            qry = qry.filter(
                SiparisTakip.teslim_edilmesi_beklenen_tarih == date.today())

        if not search_form.validate():
            result = qry.order_by(desc(SiparisTakip.siparis_tarihi)).offset(
                form_data['start']).limit(form_data['length']).all()
            total_record = qry.count()
            return self.process_data(result, form_data, total_record)

        firma_adi = search_form.firma_adi.data
        proje_no = search_form.proje_no.data
        yurutucu = search_form.yurutucu.data
        siparis_no = search_form.siparis_no.data
        siparis_tarihi = search_form.date.siparis_tarihi.data
        siparis_tarihi_option = search_form.date.siparis_tarihi_option.data
        teslim_edilmesi_beklenen_tarih = search_form.date.teslim_edilmesi_beklenen_tarih.data
        teslim_edilmesi_beklenen_tarih_option = search_form.date.teslim_edilmesi_beklenen_tarih_option.data

        if proje_no:
            qry = qry.filter(Proje.proje_no.ilike('%' + proje_no + '%'))

        if yurutucu:
            qry = qry.filter(Person.ad.ilike('%' + yurutucu + '%'))

        if firma_adi:
            qry = qry.filter(BapFirma.adi.ilike('%' + firma_adi + '%'))

        if siparis_no:
            qry = qry.filter(
                SiparisTakip.siparis_numarasi.ilike('%' + siparis_no + '%'))

        if siparis_tarihi:
            if siparis_tarihi_option == '0':
                qry = qry.filter(SiparisTakip.siparis_tarihi <= siparis_tarihi)
            if siparis_tarihi_option == '1':
                qry = qry.filter(SiparisTakip.siparis_tarihi == siparis_tarihi)
            if siparis_tarihi_option == '2':
                qry = qry.filter(SiparisTakip.siparis_tarihi >= siparis_tarihi)

        if teslim_edilmesi_beklenen_tarih:
            if teslim_edilmesi_beklenen_tarih_option == '0':
                qry = qry.filter(SiparisTakip.teslim_edilmesi_beklenen_tarih <=
                                 teslim_edilmesi_beklenen_tarih)
            if teslim_edilmesi_beklenen_tarih_option == '1':
                qry = qry.filter(SiparisTakip.teslim_edilmesi_beklenen_tarih ==
                                 teslim_edilmesi_beklenen_tarih)
            if teslim_edilmesi_beklenen_tarih_option == '2':
                qry = qry.filter(SiparisTakip.teslim_edilmesi_beklenen_tarih >=
                                 teslim_edilmesi_beklenen_tarih)

        result = qry.order_by(desc(SiparisTakip.siparis_tarihi)).offset(
            form_data['start']).limit(form_data['length']).all()

        return self.process_data(result, form_data, total_record)
def test_OrConditional_shortcircuit(always, never, member, request):
    cond = Or(always, never)
    cond.fulfill(member, request)

    assert not never.called
Exemple #14
0
class SatinalmaMuhasebeFisleri(FlaskView):
    """
        Satinalma muhasebe fisi islemleri
    """

    def get_siparis_with_firma_and_talep_kalemleri(self, siparis_id):
        """
        id si verilen siparisin faturası teslim alındı ise satınalma talep kalemleri ve firma ile
        birlikte getirir
        :param siparis_id: siparis id
        :return: SiparisTakip instance
        """
        siparis = DB.session.query(SiparisTakip).options(
            joinedload(SiparisTakip.satinalma_talep_kalemleri),
            joinedload(SiparisTakip.kazanan_firma_teklif).joinedload(
                FirmaTeklifKalemi.satinalma_teklif).joinedload(
                FirmaSatinalmaTeklif.firma)
        ).filter(
            SiparisTakip.siparis_durumu == SiparisDurumu.fatura_teslim_alindi,
            SiparisTakip.id == siparis_id
        ).first()
        return siparis

    def get_proje_for_muhasebe_fisi(self, proje_id):
        """
        "proje_id" li projeyi proje yurutucusu fakultesi ve bolumu join edilmis sekilde getirir
        :param proje_id: satinalma proje id
        :return: Proje model instance
        """
        proje = DB.session.query(Proje).options(
            joinedload(Proje.proje_yurutucu),
            joinedload(Proje.fakulte),
            joinedload(Proje.bolum),
            joinedload(Proje.gelir_kasasi)
        ).filter(Proje.id == proje_id).first()
        return proje

    @login_required
    @auth.requires(
        Or(Permission(*permission_dict["bap"]["satinalma"]["satinalma_muhasebe_fisi_goruntule"]),
           RoleReq('BAP Yetkilisi'), RoleReq("BAP Admin")))
    @route('/<int:satinalma_id>/muhase-fisleri', methods=['GET'])
    def muhasebe_fisleri(self, satinalma_id):
        """
        muhasebe fislerini listeleyen view methodu
        :param satinalma_id: ilgili satinalma id
        """

        try:
            satinalma = get_satinalma_with_related_fields(satinalma_id=satinalma_id)
            states_info = get_satinalma_next_states_info(satinalma_id=satinalma_id)
            actions_info = get_satinalma_actions_info(satinalma_id=satinalma_id)
            proje = DB.session.query(Proje).filter(Proje.id == satinalma.proje_id).first()

            satinalma_talep_kalemleri_ids = [talep_kalemi.id for talep_kalemi in
                                             satinalma.talep_kalemleri]

            satinalma_muhasebe_fisleri = DB.session.query(MuhasebeFisi).filter(
                MuhasebeFisi.satinalma_talep_id == satinalma_id
            ).all()

            satinalma_siparisleri = DB.session.query(SiparisTakip).options(
                joinedload(SiparisTakip.satinalma_talep_kalemleri),
                joinedload(SiparisTakip.kazanan_firma_teklif).joinedload(
                    FirmaTeklifKalemi.satinalma_teklif).joinedload(
                    FirmaSatinalmaTeklif.firma)
            ).filter(
                SiparisTakip.satinalma_talep_kalemleri_id.in_(satinalma_talep_kalemleri_ids),
                SiparisTakip.siparis_durumu == SiparisDurumu.fatura_teslim_alindi
            ).all()

            siparis_data = []

            for siparis in satinalma_siparisleri:
                kdv_dahil_fiyat = kdv_dahil_fiyat_hesabi(siparis.kazanan_firma_teklif.teklif,
                                                         siparis.kazanan_firma_teklif.kdv_orani)
                if not siparis.satinalma_talep_kalemleri.muhasebe_fis_id:
                    siparis_data.append({
                        "siparis_id": siparis.id,
                        "proje_kalemi": siparis.satinalma_talep_kalemleri.proje_kalemi.ad,
                        "miktar": siparis.satinalma_talep_kalemleri.talep_miktari,
                        "birim": siparis.satinalma_talep_kalemleri.proje_kalemi.birim.value,
                        "kdv_dahil_tutar": kdv_dahil_fiyat,
                        "tutar": siparis.kazanan_firma_teklif.teklif,
                        "siparis_numarasi": siparis.siparis_numarasi,
                        "firma_adi": siparis.kazanan_firma_teklif.satinalma_teklif.firma.adi,
                        "kabul_tarihi": siparis.kabul_tarihi
                    })

            muhasebe_information_form = MuhasebeFisiListelemeInformation()
        except Exception as exc:
            CustomErrorHandler.error_handler(hata="Satinalma muhasebe fişi listesi görüntülenirken "
                                                  "hata oluştu.Hata: {}, Satinalma id: {}".format(
                                                 satinalma_id,
                                                 exc)
                                             )
            return abort(500)

        return render_template("satinalma_dashboard/muhasebe_fisleri.html",
                               muhasebe_information_form=muhasebe_information_form,
                               muhesabe_fisleri=satinalma_muhasebe_fisleri,
                               satinalma_siparisleri=siparis_data,
                               satinalma=satinalma,
                               satinalma_id=satinalma_id,
                               proje=proje,
                               actions_info=actions_info,
                               states_info=states_info)

    @login_required
    @auth.requires(
        Or(Permission(*permission_dict["bap"]["satinalma"]["satinalma_muhasebe_fisi_olustur"]),
           RoleReq('BAP Yetkilisi'), RoleReq("BAP Admin")))
    @route('/<int:satinalma_id>/siparis/<int:siparis_id>/muhase-fisi-olustur', methods=['GET'])
    def muhasebe_fisi_olustur_get(self, satinalma_id, siparis_id):
        """
        Muhasebe fisi olusturma ekrani
        :param satinalma_id: ilgili satinalma id
        :param firma_id: muhasebe fisinin kesilecegi firma id
        """

        try:
            universite_id = SessionHandler.universite_id()
            satinalma = get_satinalma_with_related_fields(satinalma_id=satinalma_id)
            proje = self.get_proje_for_muhasebe_fisi(satinalma.proje_id)

            siparis = self.get_siparis_with_firma_and_talep_kalemleri(siparis_id)
            if not siparis:
                flash(_("Böyle bir sipariş bulunamadı"), category="error")
                return redirect(url_for("satinalma.SatinalmaMuhasebeFisleri:muhasebe_fisleri",
                                        satinalma_id=satinalma_id))

            if siparis.satinalma_talep_kalemleri.muhasebe_fis_id:
                flash(_("Bu sipariş için daha önce muhasebe fişi oluşturdunuz."), category="error")
                return redirect(url_for("satinalma.SatinalmaMuhasebeFisleri:muhasebe_fisleri",
                                        satinalma_id=satinalma_id))

            proje_bilgiler_data = self.get_proje_bilgileri(proje)

            genel_ayarlar = DB.session.query(GenelAyarlar).filter_by(universite_id=universite_id,
                                                                     aktif_mi=True).first()

            firma_bilgileri = siparis.kazanan_firma_teklif.satinalma_teklif.firma
            kisi_bilgileri = self.get_kisi_bilgiler(firma_bilgileri)
            kdv_dahil_alacak = kdv_dahil_fiyat_hesabi(siparis.kazanan_firma_teklif.teklif,
                                                      siparis.kazanan_firma_teklif.kdv_orani)

            proje_kalemi = siparis.satinalma_talep_kalemleri.proje_kalemi
            proje_kalemi_data = self.get_proje_kalemi_data(proje_kalemi, kdv_dahil_alacak)
            fatura_bilgisi_data = self.get_fatura_bilgileri(siparis)

            muhasebe_fis_formu = self.init_muhasebe_fisi_form(genel_ayarlar,
                                                              kisi_bilgileri,
                                                              kdv_dahil_alacak,
                                                              proje,
                                                              fatura_bilgisi_data)
            # simdiki yil ve siparis id birlesiminden belge numarasi uretir
            belge_numarasi = "{}{}".format(date.today().year, siparis.id)
            muhasebe_fis_formu.fis_genel_bilgileri.belge_numarasi.data = belge_numarasi

        except Exception as exc:
            CustomErrorHandler.error_handler(hata="Satinalma muhasebe fişi listesi görüntülenirken "
                                                  "hata oluştu.Hata: {}, Satinalma id: {}".format(
                                                 satinalma_id,
                                                 exc)
                                             )
            return abort(500)

        return render_template("satinalma_dashboard/muhasebe_fisi_olustur.html",
                               muhasebe_fis_formu=muhasebe_fis_formu,
                               proje_bilgileri=proje_bilgiler_data,
                               proje_kalemi_data=proje_kalemi_data,
                               satinalma=satinalma,
                               satinalma_id=satinalma_id,
                               siparis_id=siparis_id)

    @login_required
    @auth.requires(
        Or(Permission(*permission_dict["bap"]["satinalma"]["satinalma_muhasebe_fisi_olustur"]),
           RoleReq('BAP Yetkilisi'), RoleReq("BAP Admin")))
    @route('/<int:satinalma_id>/siparis/<int:siparis_id>/muhase-fisi-olustur', methods=['POST'])
    def muhasebe_fisi_olustur_post(self, satinalma_id, siparis_id):
        """
        Muhasebe fisi olusturma kaydeden view methodu
        :param satinalma_id: ilgili satinalma id
        :param siparis_id: muhasebe fisinin kesilecegi siparis id
        """

        # todo: kasa bilgileri gosterilecek!
        try:
            universite_id = SessionHandler.universite_id()
            satinalma = get_satinalma_with_related_fields(satinalma_id=satinalma_id)
            proje = self.get_proje_for_muhasebe_fisi(satinalma.proje_id)

            proje_bilgiler_data = self.get_proje_bilgileri(proje)

            genel_ayarlar = DB.session.query(GenelAyarlar).filter_by(universite_id=universite_id,
                                                                     aktif_mi=True).first()
            fonksiyonel_kod_choices = self.get_fonksiyonel_kod_choices(
                genel_ayarlar.bap_butce.get("fonksiyonel_kodlar", None)
            )

            siparis = self.get_siparis_with_firma_and_talep_kalemleri(siparis_id)
            kdv_dahil_tutar = kdv_dahil_fiyat_hesabi(siparis.kazanan_firma_teklif.teklif,
                                                     siparis.kazanan_firma_teklif.kdv_orani)
            proje_kalemi = siparis.satinalma_talep_kalemleri.proje_kalemi
            proje_kalemi_data = self.get_proje_kalemi_data(proje_kalemi, kdv_dahil_tutar)

            muhasebe_fis_formu = MuhasebeFisiForm(request.form)
            for fis_maddesi in muhasebe_fis_formu.fis_maddeleri:
                fis_maddesi.fonksiyonel_kod.choices = fonksiyonel_kod_choices

            if not muhasebe_fis_formu.validate():
                return render_template("satinalma_dashboard/muhasebe_fisi_olustur.html",
                                       muhasebe_fis_formu=muhasebe_fis_formu,
                                       proje_bilgileri=proje_bilgiler_data,
                                       proje_kalemi_data=proje_kalemi_data,
                                       satinalma=satinalma,
                                       satinalma_id=satinalma_id,
                                       siparis_id=siparis_id)

            # belge numarasinin daha once atanmis olma durumu kontrol edilir
            belge_numarasi_exist = DB.session.query(exists().where(
                MuhasebeFisi.muhasebe_fis_no == muhasebe_fis_formu.fis_genel_bilgileri.belge_numarasi.data)).scalar()

            if belge_numarasi_exist:
                oneri_belge_numarasi = "{}{}".format(date.today().year, siparis_id)
                hata_mesaji = "Muhasebe fişi belge numarası kullanılmaktadır. (Öneri belge " \
                              "numarası {})".format(oneri_belge_numarasi)
                muhasebe_fis_formu.fis_genel_bilgileri.belge_numarasi.errors.append(hata_mesaji)
                return render_template("satinalma_dashboard/muhasebe_fisi_olustur.html",
                                       muhasebe_fis_formu=muhasebe_fis_formu,
                                       proje_bilgileri=proje_bilgiler_data,
                                       proje_kalemi_data=proje_kalemi_data,
                                       satinalma=satinalma,
                                       satinalma_id=satinalma_id,
                                       siparis_id=siparis_id)

            proje_kalemi = siparis.satinalma_talep_kalemleri.proje_kalemi
            talep_edilen_miktar = siparis.satinalma_talep_kalemleri.talep_miktari
            # firma teklifi kabul edildigi zaman firmanin teklifinin kdv dahil tutari rezerv
            # butce olarak proje kalemine eklenmisti. Muhasebe fisi olusturuldugu anda rezerv
            # edilen para kullanilan paraya aktarilir
            proje_kalemi.rezerv_butce = proje_kalemi.rezerv_butce - kdv_dahil_tutar
            proje_kalemi.kullanilan_butce = proje_kalemi.kullanilan_butce + kdv_dahil_tutar
            # proje yurutucusu satinalma talebi yaptigi anda talep edilen miktar rezerv edilmisti
            # Muhasebe fisi olusturuldugu anda rezerv miktar kullanilan miktara aktarilir
            proje_kalemi.rezerv_edilen_miktar = proje_kalemi.rezerv_edilen_miktar - talep_edilen_miktar
            proje_kalemi.kullanilan_miktar = proje_kalemi.kullanilan_miktar + talep_edilen_miktar

            proje_bilgileri_data = self.get_proje_bilgileri(proje)
            yeni_muhasebe_fisi = self.muhasebe_fisi_kaydet(
                muhasebe_fis_formu,
                proje_bilgileri_data["proje_no"],
                proje_bilgileri_data["proje_yurutucu_ad_soyad"],
                satinalma_id=satinalma_id,
                fis_tutari=kdv_dahil_tutar
            )
            DB.session.add(yeni_muhasebe_fisi)
            DB.session.flush()
            self.muhasebe_fis_maddesi_kaydet(muhasebe_fis_formu.fis_maddeleri,
                                             yeni_muhasebe_fisi.id)

            siparis.satinalma_talep_kalemleri.muhasebe_fis_id = yeni_muhasebe_fisi.id
            siparis.siparis_durumu = SiparisDurumu.siparis_tamamlandi

            projenin_bagli_oldugu_kasa = proje.gelir_kasasi
            projenin_bagli_oldugu_kasa.rezerv_para -= kdv_dahil_tutar
            projenin_bagli_oldugu_kasa.harcanan_para += kdv_dahil_tutar

            signal_payload = {
                "message_type": USER_ACTIVITY_MESSAGES.get("bap").get("muhasebe_fisi_olusturuldu").type_index,
                "nesne": 'Proje',
                "nesne_id": proje.id,
                "ekstra_mesaj": "{} isimli kullanıcı {} id'li projenin {} id'li proje kaleminde "
                                "yapilan satınalma sonucu {} id 'li {} TL tutarında muhasebe fişi "
                                "oluşturdu".format(
                    current_user.username,
                    proje.id,
                    proje_kalemi.id,
                    yeni_muhasebe_fisi.id,
                    kdv_dahil_tutar
                )
            }
            signal_sender(**signal_payload)

            DB.session.commit()

            flash(_("Muhasebe fişi başarıyla oluşturulmuştur."), category="success")
            return redirect(url_for("satinalma.SatinalmaMuhasebeFisleri:muhasebe_fisleri",
                                    satinalma_id=satinalma_id))

        except Exception as exc:
            DB.session.rollback()
            CustomErrorHandler.error_handler(hata="Satinalma muhasebe fişi listesi görüntülenirken "
                                                  "hata oluştu.Hata: {}, Satinalma id: {}".format(
                                                 satinalma_id,
                                                 exc)
                                             )
            return abort(500)

    @login_required
    @auth.requires(
        Or(Permission(*permission_dict["bap"]["satinalma"]["satinalma_muhasebe_fisi_olustur"]),
           RoleReq('BAP Yetkilisi'), RoleReq("BAP Admin")))
    @route('/<int:satinalma_id>/muhasebe-fisi/<int:muhasebe_fis_id>', methods=['GET'])
    def get_odeme_emri_sablonu(self, satinalma_id, muhasebe_fis_id):
        """
        Odeme emri sablonunu ilgili muhasebe fisi alanlari ile render edip kullaniciya doner
        """
        try:
            muhasebe_fisi_data = BapQueryHelpers.get_muhasebe_fisi_bilgileri(muhasebe_fis_id)
            # sablon tipi id 49 --> Ödeme Emri Şablonu
            odeme_emri_sablonu = DB.session.query(Sablon).filter(
                Sablon.sablon_tipi_id == 49,
                Sablon.kullanilabilir_mi == True
            ).order_by(desc(Sablon.updated_at)).first()
            muhasebe_fisi = DB.session.query(MuhasebeFisi).filter(
                MuhasebeFisi.id == muhasebe_fis_id).first()
            muhasebe_fisi.odeme_emri_tamamlandi = True
            DB.session.commit()
            return render_template_string(odeme_emri_sablonu.sablon_text, data=muhasebe_fisi_data)

        except Exception as exc:
            DB.session.rollback()
            CustomErrorHandler.error_handler(hata="Muhasebe fişi ödeme emrine çevrilirken bir hata "
                                                  "oluştu.Hata: {}, Satinalma id: {}, "
                                                  "Muhasebe Fisi id: {}".format(
                                                 satinalma_id,
                                                 muhasebe_fis_id,
                                                 exc)
                                             )
            return abort(500)

    def get_kisi_bilgiler(self, firma_bilgileri):
        """
        Firma bilgilerinden muhasebe fisi formu icin uygun formatta kisi bilgileri olusturur
        :param firma_bilgileri:
        :return:
        """
        kisi_bilgileri = {
            "adi_soyadi": "{} {} - {}".format(
                firma_bilgileri.yetkili_adi,
                firma_bilgileri.yetkili_adi,
                firma_bilgileri.adi
            ),
            "banka_sube": firma_bilgileri.banka_sube_adi,
            "vergi_no": firma_bilgileri.vergi_kimlik_numarasi,
            "hesap_no": firma_bilgileri.iban,
            "vergi_dairesi_id": firma_bilgileri.vergi_dairesi_id,
        }

        return kisi_bilgileri

    def get_fatura_bilgileri(self, siparis):
        """
        Siparis fatura bilgilerinden muhasebe formu icin uygun formatta data olusturur
        :param siparis: Siparis model instance
        :return:
        """
        fatura_bilgileri = {
            "fatura_no": siparis.fatura_no,
            "fatura_tarihi": siparis.fatura_tarihi,
        }

        return fatura_bilgileri

    def get_proje_bilgileri(self, proje):
        """
        proje model instancendan proje bilgileri dict olusturur
        :param proje: Proje model instance
        :return: dict
        """
        proje_bilgiler_data = {
            "proje_no": proje.proje_no,
            "proje_adi": proje.proje_basligi,
            "proje_yurutucu_ad_soyad": "{} {} {}".format(
                proje.proje_yurutucu.hitap_unvan.ad,
                proje.proje_yurutucu.personel.person.ad,
                proje.proje_yurutucu.personel.person.soyad),
            "proje_fakulte": proje.fakulte.ad,
            "proje_bolum": proje.bolum.ad,
        }
        return proje_bilgiler_data

    def init_muhasebe_fisi_form(self, genel_ayarlar, kisi_bilgileri, kdv_dahil_alacak, proje,
                                fatura_bilgisi):
        """
        :param genel_ayarlar: uygulama genel ayarlari
        :param kisi_bilgileri: muhasebe fisinin kesilecegi kisi
        :param kdv_dahil_alacak: firmanin teklifi ve kdv oranindan olusan kdv dahil alacak
        :return: MuhasebeFisiForm
        """
        kurumsal_kod = ""
        genel_ayarlar_butce = {}
        fonksiyonel_kod_choices = []

        if genel_ayarlar:
            genel_ayarlar_butce.update(genel_ayarlar.bap_butce)
            kurumsal_kod = genel_ayarlar_butce.get("kurum_kodu", "")
            fonksiyonel_kod_choices = self.get_fonksiyonel_kod_choices(
                genel_ayarlar_butce.get("fonksiyonel_kodlar", None)
            )

        genel_ayarlar_butce.update(
            {"fakulte_bolum": "{}/{}".format(proje.fakulte.ad, proje.bolum.ad)})
        muhasebe_fis_formu = MuhasebeFisiForm(fis_genel_bilgileri=genel_ayarlar_butce,
                                              odeme_yapilacak_kisi_bilgileri=kisi_bilgileri,
                                              fatura_bilgileri=fatura_bilgisi)

        for index, fis_maddesi in enumerate(muhasebe_fis_formu.fis_maddeleri, start=0):
            fis_maddesi.kurumsal_kod.data = kurumsal_kod
            fis_maddesi.fonksiyonel_kod.choices = fonksiyonel_kod_choices
            fis_maddesi.fonksiyonel_kod.default = fonksiyonel_kod_choices[0]

            if index % 2 == 0:
                fis_maddesi.borc.data = kdv_dahil_alacak
                fis_maddesi.alacak.data = Decimal("0.00")
            else:
                fis_maddesi.borc.data = Decimal("0.00")
                fis_maddesi.alacak.data = kdv_dahil_alacak

        return muhasebe_fis_formu

    def get_fonksiyonel_kod_choices(self, fonksiyonel_kodlar):
        """
        genel ayarlari kaydedilmis fonksiyonel kodlari alip muhasebe fisi maddelerinde kullanmak
        üzere list of tuple a cevirir
        :param fonksiyonel_kodlar: List of dict
        :return: List of tuple
        """
        fonksiyonel_kod_choices = []
        for fonksiyonel_kod in fonksiyonel_kodlar:
            fonksiyonel_kod_choices.append((fonksiyonel_kod.get("kod"),
                                            fonksiyonel_kod.get("kod")))
        return fonksiyonel_kod_choices

    def muhasebe_fisi_kaydet(self, muhasebe_fisi_formu, proje_no, yurutucu_ad_soyad,
                             satinalma_id, fis_tutari):
        vergi_dairesi = DB.session.query(VergiDairesi).filter(
            VergiDairesi.id == muhasebe_fisi_formu.odeme_yapilacak_kisi_bilgileri.vergi_dairesi_id.data).first()
        yeni_muhasebe_fisi = MuhasebeFisi(
            satinalma_talep_id=satinalma_id,
            muhasebe_fis_no=muhasebe_fisi_formu.fis_genel_bilgileri.belge_numarasi.data,
            muhasebe_fis_tarihi=muhasebe_fisi_formu.fis_genel_bilgileri.belge_tarihi.data,
            butce_yili=muhasebe_fisi_formu.fis_genel_bilgileri.yil.data,
            kurum_adi=muhasebe_fisi_formu.fis_genel_bilgileri.kurum_adi.data,
            kurum_kodu=muhasebe_fisi_formu.fis_genel_bilgileri.kurum_kodu.data,
            birim_adi=muhasebe_fisi_formu.fis_genel_bilgileri.birim_adi.data,
            birim_kodu=muhasebe_fisi_formu.fis_genel_bilgileri.birim_kodu.data,
            muhasebe_birim_adi=muhasebe_fisi_formu.fis_genel_bilgileri.muhasebe_birimi_adi.data,
            muhasebe_birim_kodu=muhasebe_fisi_formu.fis_genel_bilgileri.muhasebe_birimi_kodu.data,
            proje_no=proje_no,
            proje_yurutucusu=yurutucu_ad_soyad,
            fakulte_bolum=muhasebe_fisi_formu.fis_genel_bilgileri.fakulte_bolum.data,
            ad_soyad=muhasebe_fisi_formu.odeme_yapilacak_kisi_bilgileri.adi_soyadi.data,
            vergi_kimlik_no=muhasebe_fisi_formu.odeme_yapilacak_kisi_bilgileri.vergi_no.data,
            banka_sube=muhasebe_fisi_formu.odeme_yapilacak_kisi_bilgileri.banka_sube.data,
            banka_iban=muhasebe_fisi_formu.odeme_yapilacak_kisi_bilgileri.hesap_no.data,
            bagli_oldugu_vergi_dairesi=vergi_dairesi.adi,
            fatura_no=muhasebe_fisi_formu.fatura_bilgileri.fatura_no.data,
            fatura_tarihi=muhasebe_fisi_formu.fatura_bilgileri.fatura_tarihi.data,
            fatura_aciklama=muhasebe_fisi_formu.fatura_bilgileri.aciklama.data,
            fis_tutari=fis_tutari
        )

        return yeni_muhasebe_fisi

    def muhasebe_fis_maddesi_kaydet(self, fis_maddeleri_formu, muhasebe_fisi_id):
        for fis_maddesi in fis_maddeleri_formu:
            detayli_hesap_kodu = DB.session.query(DetayliHesapPlanlari).filter(
                DetayliHesapPlanlari.id == fis_maddesi.hesap_kodu.data).first()

            hesap_kod_duzeyleri = self.detayli_hesap_kodu_parser(detayli_hesap_kodu.hesap_kodu)

            yeni_fis_maddesi = MuhasebeFisMaddesi(
                muhasebe_fis_id=muhasebe_fisi_id,
                hesap_kodu=hesap_kod_duzeyleri["hesap_kodu"],
                ekonomik_hesap_kodu=hesap_kod_duzeyleri["ekonomik_kod"],
                kurumsal_kod=fis_maddesi.kurumsal_kod.data,
                fonksiyonel_kod=fis_maddesi.fonksiyonel_kod.data,
                finans_kodu=fis_maddesi.finans_kodu.data,
                borc=fis_maddesi.borc.data,
                alacak=fis_maddesi.alacak.data,
                hesap_ayrinti_adi=detayli_hesap_kodu.ana_hesap_hesap_grubu_yardimci_hesap_adi,
            )
            DB.session.add(yeni_fis_maddesi)

    def detayli_hesap_kodu_parser(self, hesap_kodu):
        """
        Muhasebe fis maddelerini kaydederken hesap kodunu ve ekonomik kodu ayrı ayrı kaydediyoruz.
        630.03.07.00.00 seklinde bir kod geliyor. 630 lu kısım hesap kodu. 03.07.00.00 lı kısım
        ekonomik kodu temsil ediyor. Duruma gore sadece "630" seklinde bir kodda gelebiliyor.
        :param hesap_kodu: detayli hesap plani tablosunda yer alan kod
        :return:
        """
        hesap_kod_duzeyleri = {
            "hesap_kodu": "",
            "ekonomik_kod": "",
        }
        # genel kodu "." ya gore 1 kere split eder
        hesap_kodu_array = hesap_kodu.split(".", 1)
        hesap_kod_duzeyleri["hesap_kodu"] = hesap_kodu_array[0]
        if len(hesap_kodu_array) > 1:
            hesap_kod_duzeyleri["ekonomik_kod"] = hesap_kodu_array[1]

        return hesap_kod_duzeyleri

    def get_proje_kalemi_data(self, proje_kalemi, kdv_dahil_tutar):
        data = {
            "proje_kalemi_adi": proje_kalemi.ad,
            "butce_kalemi_kodu": proje_kalemi.proje_turu_butce_kalemi.gider_siniflandirma_kalemi.kodu,
            "butce_kalemi_adi": proje_kalemi.proje_turu_butce_kalemi.gider_siniflandirma_kalemi.aciklama,
            "fis_tutari": kdv_dahil_tutar,
            "toplam_butce": proje_kalemi.toplam_butce,
            "rezerv_butce": proje_kalemi.rezerv_butce,
            "kullanilan_butce": proje_kalemi.kullanilan_butce,
        }
        return data
Exemple #15
0
class ProjeHakemView(FlaskView):
    """Proje hakem önerilerinin ve proje hakemlerinin goruntulendigi view"""

    @login_required
    @auth.requires(
        And(Permission(
            *permission_dict["bap"]["proje"]["dashboard"]["proje_hakemleri_goruntuleme"]),
            Or(Role('BAP Yetkilisi'), Role("BAP Admin"))))
    @route('<int:proje_id>/dashboard/hakem', methods=["GET"], endpoint='proje_hakem_get')
    def proje_hakem_get(self, proje_id):
        """Proje raporlarini goruntulemek icin kullanilir"""

        proje = DB.session.query(Proje).options(
            joinedload(Proje.proje_yurutucu).load_only("id").joinedload(
                OgretimElemani.personel).load_only("id").joinedload(
                Personel.person).load_only("ad", "soyad"),
            lazyload(Proje.proje_detayi),
            lazyload(Proje.kabul_edilen_proje_hakemleri),
            lazyload(Proje.proje_destekleyen_kurulus),
            lazyload(Proje.proje_kalemleri),
        ).filter(Proje.id == proje_id, or_(Proje.proje_basvuru_durumu == ProjeBasvuruDurumu.tamamlandi,
                                           Proje.proje_basvuru_durumu == ProjeBasvuruDurumu.revizyon_bekleniyor)).first()

        next_states_info = get_next_states_info(proje_id=proje_id)
        actions_info = get_actions_info(proje_id=proje_id)
        proje_yurutucusu_mu = ProjeYurutucusu().fulfill(user=current_user)

        proje_hakem_onerileri = proje.proje_hakem_onerileri

        proje_hakemleri = DB.session.query(ProjeHakemleri).options(
            joinedload(ProjeHakemleri.hakem).joinedload("*")
        ).filter(ProjeHakemleri.proje_id == proje_id).all()

        hakem_ekle_form = HakemEkleForm()

        return render_template(
            'dashboard/proje_hakemleri.html',
            proje_id=proje_id,
            proje=proje,
            proje_yurutucusu_mu=proje_yurutucusu_mu,
            next_states_info=next_states_info,
            actions_info=actions_info,
            hakem_onerileri=proje_hakem_onerileri,
            proje_hakemleri=proje_hakemleri,
            hakem_ekle_form=hakem_ekle_form
        )

    @staticmethod
    @login_required
    @auth.requires(
        And(Permission(*permission_dict["bap"]["proje"]["dashboard"]["projeye_hakem_atama"]),
            Or(Role("BAP Yetkilisi"), Role("BAP Admin"))))
    @route('/<int:proje_id>/proje-hakemleri/<int:proje_hakem_id>', methods=['DELETE'])
    def proje_hakem_sil(proje_id, proje_hakem_id):
        """
        Seçilen hakemin projehakem davet durumunu cikarildi olarak degistirir.

        """
        try:

            proje_hakem = DB.session.query(ProjeHakemleri).filter(
                ProjeHakemleri.proje_id == proje_id,
                ProjeHakemleri.id == proje_hakem_id).one()
            proje_hakem.davet_durumu = ProjeHakemDavetDurumlari.cikarildi

            DB.session.commit()
            signal_payload = {
                "message_type": USER_ACTIVITY_MESSAGES.get("bap").get("hakem_atama_sil").type_index,
                "nesne": 'Proje Hakemleri',
                "nesne_id": proje_id,
                "ekstra_mesaj": "{} adlı kullanıcı, {} id'li hakemi proje hakemleri arasindan "
                                "cikardi.".format(current_user.username, proje_hakem_id)
            }
            signal_sender(**signal_payload)

            return jsonify(status="success")
        except SQLAlchemyError as exc:
            DB.session.rollback()
            CustomErrorHandler.error_handler(
                                             hata="Proje idsi %s olan proje hakemleri arasından %s idli hakemi çıkarmaya "
                                                  "çalışılırken bir sorun oluştu. Hata: %s" % (
                                                      proje_id, proje_hakem_id, exc)
                                             )
        return jsonify(status="error"), 400

    @staticmethod
    @login_required
    @auth.requires(
        And(Permission(*permission_dict["bap"]["proje"]["dashboard"]["projeye_hakem_atama"]),
            Or(Role("BAP Yetkilisi"), Role("BAP Admin"))))
    @route('/<int:proje_id>/hakem/<int:hakem_id>/ekle', methods=['POST'])
    def proje_hakemi_ekle(proje_id, hakem_id):
        """
        Secilen hakemi proje hakemleri modeline kaydeder.
        Eger daha once kaydedilmemis bir hakem ise ProjeHakem model instance i olusturup kaydeder.
        Daha once projeye hakemlik teklifini reddeden bir hakeme teklif gonderilmis ise "davet_durumu"
        alani "gonderildi" yapilir.
        Eger daha önce projeye atanip proje hakemlerinden cikarilan bir hakemi eklemeye calisirsa
        var olan projehakem kaydini bulup "davet_durumu" alani "gonderildi" yapilir.


        """
        try:
            proje_hakem = DB.session.query(ProjeHakemleri).options(
                joinedload(ProjeHakemleri.hakem).joinedload(Hakem.person),
                joinedload(ProjeHakemleri.hakem).joinedload(Hakem.personel)
            ).filter(
                ProjeHakemleri.hakem_id == hakem_id,
                ProjeHakemleri.proje_id == proje_id).scalar()
            proje = DB.session.query(Proje.proje_no.label("proje_no")).filter(Proje.id == proje_id).first()
            if proje_hakem:
                if proje_hakem.davet_durumu == ProjeHakemDavetDurumlari.gonderildi:
                    # davet durumu gonderildi durumunda ise yani hakem daveti yanıtlamadıysa
                    # bu durum gecerlidir.
                    return jsonify(status="error",
                                   error_message=_("Bu hakeme zaten davet gönderildi")), 409
                elif proje_hakem.davet_durumu == ProjeHakemDavetDurumlari.kabul_edildi:
                    return jsonify(status="error",
                                   error_message=_("Bu kişi zaten proje hakemi")), 409

                else:
                    # daveti kabul etmeyen veya projeden cikarilan hakem durumlari icin gecerlidir
                    proje_hakem.davet_durumu = ProjeHakemDavetDurumlari.gonderildi
                # eger proje_hakem i var ise daha once bu hakeme teklif gonderilmis ve herhangi bir
                # "davet_durumu" stateinde olabilir.
                hakem_person_id = proje_hakem.hakem.personel.person_id if proje_hakem.hakem.personel else proje_hakem.hakem.person_id
            else:
                hakem = DB.session.query(Hakem).options(
                    joinedload(Hakem.person),
                    joinedload(Hakem.personel)
                ).filter(Hakem.id == hakem_id).first()
                # daha once bu hakem proje ile iliskilendirilmemis.
                yeni_hakem = ProjeHakemleri(proje_id=proje_id, hakem_id=hakem_id)
                DB.session.add(yeni_hakem)
                hakem_person_id = hakem.personel.person_id if hakem.personel else hakem.person_id

            payload = {
                "notification_receiver": hakem_person_id,
                "notification_title": "Proje Hakemlik Daveti",
                "notification_message": "{} numaralı projeye hakem olmanız için davet gönderildi.".format(
                    proje.proje_no),
                "proje_id": proje_id,
            }

            signal_sender(log=False, notification=True, **payload)

            DB.session.commit()
            signal_payload = {
                "message_type": USER_ACTIVITY_MESSAGES.get("bap").get("hakem_atama").type_index,
                "nesne": 'Proje Hakemleri',
                "nesne_id": proje_id,
                "ekstra_mesaj": "{} adlı kullanıcı, {} id'li hakeme hakemlik daveti gonderidi.".format(
                    current_user.username,
                    hakem_id
                )
            }
            signal_sender(**signal_payload)

            return jsonify(status="success")
        except SQLAlchemyError as exc:
            DB.session.rollback()
            CustomErrorHandler.error_handler(
                                             hata="Proje idsi %s olan projeye hakem eklemeye çalışılırken bir sorun oluştu. Hata: %s"
                                                  % (proje_id, exc)
                                             )
        return jsonify(status="error", error_message=_(
            "Beklenmedik bir hata oluştur. Lütfen daha sonra tekrar deneyiniz")), 409
Exemple #16
0
class BapFirmaView(FlaskView):
    """Bap anasyafa view classi"""
    @staticmethod
    @login_required
    @auth.requires(Or(
        Permission(*permission_dict["yonetim"]["firma_yonetimi"]
                   ["firma_listesi_goruntuleme"]), Role("BAP Yetkilisi")),
                   menu_registry={
                       'path': '.yonetim.firma_yonetimi.firma_listesi',
                       'title': _("Firma Listesi")
                   })
    @route('/firma-liste', methods=['GET'])
    def firma_liste():
        """Firma Listesi Ekrani"""
        firmalar = DB.session.query(BapFirma).options(joinedload(
            BapFirma.user)).all()
        onay_bekleyen_firmalar = []
        reddedilen_firmalar = []
        kabul_edilen_firmalar = []

        for firma in firmalar:
            if firma.onaylandi:
                kabul_edilen_firmalar.append(firma)
            elif firma.reddedildi_mi:
                reddedilen_firmalar.append(firma)
            else:
                onay_bekleyen_firmalar.append(firma)

        return render_template("firma_liste.html",
                               kabul_edilen_firmalar=kabul_edilen_firmalar,
                               reddedilen_firmalar=reddedilen_firmalar,
                               onay_bekleyen_firmalar=onay_bekleyen_firmalar)

    @staticmethod
    @login_required
    @auth.requires(
        Or(
            Permission(*permission_dict["yonetim"]["firma_yonetimi"]
                       ["firma_goruntuleme"]), Role("BAP Yetkilisi")))
    @route('/firma-detay/<int:firma_id>', methods=['GET'])
    def firma_detay(firma_id):
        """Firma Listesi Ekrani"""

        firma = DB.session.query(BapFirma).filter(
            BapFirma.id == firma_id).one()
        form = FirmaKayitFormu(**firma.to_dict())

        return render_template("firma_bilgileri.html", firma=firma, form=form)

    @staticmethod
    @login_required
    @auth.requires(
        Or(
            Permission(*permission_dict["yonetim"]["firma_yonetimi"]
                       ["firma_guncelleme"]), FirmaYetkilisi()))
    @route('/firma-detay-guncelle/<int:firma_id>',
           methods=['POST'],
           endpoint='firma_detay_guncelle')
    def firma_detay_guncelle(firma_id):
        """Firma Listesi Ekrani"""

        firma = DB.session.query(BapFirma).filter(
            BapFirma.id == firma_id).one()
        form = FirmaKayitFormu(request.form)
        form.yetkili_email.validators = None
        form.yetkili_adi.validators = None
        form.yetkili_soyadi.validators = None
        form.adres.validators = None
        form.firma_faaliyet_belgesi_id.validators = None
        form.telefon.validators = None
        form.email.validators = None
        firma.yetkili_adi = form.yetkili_adi.data
        firma.yetkili_soyadi = form.yetkili_soyadi.data
        firma.yetkili_email = form.yetkili_email.data
        firma.adres = form.adres.data
        firma_faaliyet_belgesi_id = request.files.get(
            form.firma_faaliyet_belgesi_id.name)
        if firma_faaliyet_belgesi_id:
            firma.firma_faaliyet_belgesi_id = firma_faaliyet_belgesi_id

        firma.telefon = form.telefon.data
        firma.email = form.email.data
        DB.session.commit()
        flash("Firma bilgileri başarıyla güncellenmiştir.")
        return redirect(url_for('firma.firma_detay', firma_id=firma.id))

    @staticmethod
    @login_required
    @auth.requires(
        Or(
            Permission(*permission_dict["yonetim"]["firma_yonetimi"]
                       ["firma_goruntuleme"]), Role("BAP Yetkilisi")))
    @route('/faaliyet-belgesi-indir/<int:firma_id>',
           methods=['GET'],
           endpoint="firma_faaliyet_belgesi_indir")
    def firma_faaliyet_belgesi_indir(firma_id):
        """Firma Listesi Ekrani"""
        firma = DB.session.query(BapFirma).get(firma_id)
        try:
            belge = DB.session.query(File).filter(
                File.id == firma.firma_faaliyet_belgesi_id).one()
            return send_file(belge.file_object,
                             attachment_filename=belge.content.file.filename,
                             as_attachment=True,
                             mimetype=belge.content.file.content_type)
        except Exception as exc:
            CustomErrorHandler.error_handler()
            return abort(400)

    @login_required
    @auth.requires(
        Or(
            Permission(*permission_dict["yonetim"]["firma_yonetimi"]
                       ["firma_onaylama"]), Role("BAP Yetkilisi"),
            Role("BAP Admin")))
    @route('/firma-onay/<int:firma_id>', methods=['POST'])
    def firma_onay(self, firma_id):
        onay = bool(int(request.get_json().get('onay')))
        firma = DB.session.query(BapFirma).filter(
            BapFirma.id == firma_id).first()

        if not onay:
            firma.onaylandi = False
            firma.reddedildi_mi = True
            firma.faaliyet_durumu = False
            DB.session.commit()
            signal_payload = {
                "message_type":
                USER_ACTIVITY_MESSAGES.get("bap").get("firma_red").type_index,
                "nesne":
                'BapFirma',
                "nesne_id":
                firma.id,
                "ekstra_mesaj":
                "{} adlı kullanıcı, {} idli firmayı reddetti.".format(
                    current_user.username, firma.id)
            }
            signal_sender(**signal_payload)
            return jsonify(status="success")
        else:
            firma.onaylandi = True
            firma.faaliyet_durumu = True
            firma.reddedildi_mi = False

            DB.session.commit()
            signal_payload = {
                "message_type":
                USER_ACTIVITY_MESSAGES.get("bap").get("firma_onay").type_index,
                "nesne":
                'BapFirma',
                "nesne_id":
                firma.id,
                "ekstra_mesaj":
                "{} adlı kullanıcı, {} idli firmayı onayladı.".format(
                    current_user.username, firma.id)
            }
            signal_sender(**signal_payload)
            flash("Firma başarıyla onaylanmıştır..")
            return jsonify(status="success")
Exemple #17
0
class ProjeSablonEkDosyaView(FlaskView):
    """
        Proje şablonlari ve ek dosyalari goruntulendigi view
    """
    @login_required
    @auth.requires(
        Or(
            And(
                Permission(*permission_dict["bap"]["proje"]["dashboard"]
                           ["proje_sablon_ek_dosya_goruntuleme"]),
                ProjeYurutucusu()), RoleReq('BAP Yetkilisi'),
            RoleReq("BAP Admin"), AtanmisHakem()))
    @route('/<int:proje_id>/sablon',
           methods=['GET'],
           endpoint='sablon_ekdosya_listele')
    def sablon_ekdosya_listele(self, proje_id):
        """
        Projenin şablon cikti ve ek dosyalarina ulasmak icin kullanilir
        """
        proje_yurutucusu_mu = ProjeYurutucusu().fulfill(user=current_user)
        atanmis_hakem = AtanmisHakem()
        proje = DB.session.query(Proje).options(
            joinedload(Proje.proje_proje_turu).load_only(
                "oneri_sablon_id", "hakem_degerlendirme_sablon_id",
                "hakem_ara_rapor_sablon_id", "ara_rapor_sablon_id",
                "sonuc_raporu_sablon_id", "sozlesme_sablon_id",
                "hakem_sonuc_rapor_sablon_id"),
            joinedload(Proje.proje_yurutucu).load_only("id").joinedload(
                OgretimElemani.personel).load_only("id").joinedload(
                    Personel.person).load_only("ad", "soyad"),
            joinedload(Proje.proje_belgeleri),
            lazyload(Proje.proje_detayi),
            lazyload(Proje.kabul_edilen_proje_hakemleri),
            lazyload(Proje.proje_hakem_onerileri),
            lazyload(Proje.proje_destekleyen_kurulus),
            lazyload(Proje.proje_kalemleri),
        ).filter(
            Proje.id == proje_id,
            or_(
                Proje.proje_basvuru_durumu == ProjeBasvuruDurumu.tamamlandi,
                Proje.proje_basvuru_durumu ==
                ProjeBasvuruDurumu.revizyon_bekleniyor)).first()

        next_states_info = get_next_states_info(proje_id=proje_id)
        actions_info = get_actions_info(proje_id=proje_id)

        proje_turu = DB.session.query(ProjeTuru).options(
            joinedload(ProjeTuru.cikti),
            joinedload(ProjeTuru.ek_dosyalar).joinedload(EkDosya.belge),
        ).filter_by(id=proje.proje_turu).one()
        ciktilar = []
        for cikti in proje_turu.cikti:
            ciktilar.append({
                "adi":
                cikti.adi,
                "yurutucu_gorebilir_mi":
                True if cikti.gorunurluk
                == GorunurlukSecenekleri.yurutucu_ve_yonetici else False,
                "sablon_id":
                cikti.sablon_id,
                "sablon_adi":
                cikti.sablon_belge.adi,
            })

        proje_ek_dosyalar = []
        proje_diger_dosyalar = []
        for ek_dosya in proje_turu.ek_dosyalar:
            for proje_belge in proje.proje_belgeleri:
                if proje_belge.proje_turu_ek_dosya_id == ek_dosya.id:
                    proje_ek_dosyalar.append({
                        # "proje_belge_id",
                        "proje_belge_file_id":
                        proje_belge.belge_id,
                        "proje_belge_aciklama":
                        proje_belge.aciklama,
                        "ornek_file_id":
                        ek_dosya.belge.file_id,
                        "ornek_file_ad":
                        ek_dosya.belge.adi,
                        "proje_icerik_dosyasi_mi":
                        ek_dosya.proje_icerik_dosyasi_mi,
                        "belgenin_ciktisi_alinacak_mi":
                        ek_dosya.belgenin_ciktisi_alinacak_mi,
                        "zorunlu_mu":
                        ek_dosya.zorunlu_mu
                    })
                    break
        for proje_belge in proje.proje_belgeleri:
            if proje_belge.proje_turu_ek_dosya_id is None:
                proje_diger_dosyalar.append({
                    "adi": proje_belge.baslik,
                    "aciklama": proje_belge.aciklama,
                    "file_id": proje_belge.belge_id
                })
                break

        # todo: gereklimi ? ustteki querye dahil edilip alinabilir
        proje_turu_sablonlari = DB.session.query(Sablon).filter(
            Sablon.id.in_([
                proje.proje_proje_turu.oneri_sablon_id,
                proje.proje_proje_turu.hakem_degerlendirme_sablon_id,
                proje.proje_proje_turu.hakem_ara_rapor_sablon_id,
                proje.proje_proje_turu.hakem_sonuc_rapor_sablon_id,
                proje.proje_proje_turu.ara_rapor_sablon_id,
                proje.proje_proje_turu.sonuc_raporu_sablon_id,
                proje.proje_proje_turu.sozlesme_sablon_id,
            ])).all()
        return render_template("dashboard/proje_sablon_ekdosyalar.html",
                               proje_id=proje_id,
                               proje=proje,
                               next_states_info=next_states_info,
                               actions_info=actions_info,
                               proje_yurutucusu_mu=proje_yurutucusu_mu,
                               ciktilar=ciktilar,
                               proje_ek_dosyalar=proje_ek_dosyalar,
                               proje_diger_dosyalar=proje_diger_dosyalar,
                               proje_turu_sablonlari=proje_turu_sablonlari,
                               proje_turu=proje_turu,
                               atanmis_hakem=atanmis_hakem)
Exemple #18
0
class SatinalmaUrunlerListesiView(FlaskView):
    """
        Satinalma ürünleri listeleyen view
    """

    @login_required
    @auth.requires(
        Or(Permission(*permission_dict["bap"]["satinalma"]["satinalma_urun_listesi_goruntuleme"]),
           RoleReq('BAP Yetkilisi'), RoleReq("BAP Admin")))
    @route('/<int:satinalma_id>/urun-listesi', methods=['GET'],
           endpoint='satinalma_urunler_listele')
    def satinalma_urunler_listele(self, satinalma_id):
        """
        Satinalma ürünlerine ulasmak icin kullanilir
        :param satinalma_id: satinalma_id(int)
        :return: http response
        """

        try:
            satinalma = get_satinalma_with_related_fields(satinalma_id=satinalma_id)
            states_info = get_satinalma_next_states_info(satinalma_id=satinalma_id)
            actions_info = get_satinalma_actions_info(satinalma_id=satinalma_id)
            proje = DB.session.query(Proje).filter(Proje.id == satinalma.proje_id).first()

            talep_kalemleri_with_siparis_info = []
            for talep_kalemi in satinalma.talep_kalemleri:
                data = {
                    "kalem_adi": talep_kalemi.proje_kalemi.ad,
                    "kalem_gerekce": talep_kalemi.proje_kalemi.gerekce,
                    "birim": talep_kalemi.proje_kalemi.birim.value,
                    "miktar": talep_kalemi.talep_miktari,
                    "tutar": talep_kalemi.proje_kalemi.toplam_butce / talep_kalemi.proje_kalemi.toplam_miktar * talep_kalemi.talep_miktari,
                    "teknik_sartname_id": talep_kalemi.teknik_sartname_file_id,
                    "firma_adi": "-",
                    "teslimat_suresi": "-",
                    "kdv_dahil_teklif": 0,
                    "siparis_takip_no": "-",
                    "siparis_durumu": "-"
                }
                if talep_kalemi.siparis_takip:
                    kdv_dahil_teklif = kdv_dahil_fiyat_hesabi(talep_kalemi.siparis_takip.kazanan_firma_teklif.teklif,
                                                              talep_kalemi.siparis_takip.kazanan_firma_teklif.kdv_orani)
                    data.update({
                        "firma_adi": talep_kalemi.siparis_takip.kazanan_firma_teklif.satinalma_teklif.firma.adi,
                        "teslimat_suresi": talep_kalemi.siparis_takip.kazanan_firma_teklif.teslimat_suresi,
                        "kdv_dahil_teklif": kdv_dahil_teklif,
                        "siparis_takip_no": talep_kalemi.siparis_takip.siparis_numarasi,
                        "siparis_durumu": talep_kalemi.siparis_takip.siparis_durumu.value if talep_kalemi.siparis_takip.siparis_durumu else "-"
                    })
                talep_kalemleri_with_siparis_info.append(data)

        except Exception as exc:
            CustomErrorHandler.error_handler(hata="Satinalma ürün listesi görüntülenirken hata oluştu."
                                                  "Hata: {}, Satinalma id: {}".format(satinalma_id,
                                                                                      exc)
                                             )
            return abort(500)

        return render_template("satinalma_dashboard/satinalma_urunler.html",
                               talep_kalemleri_with_siparis_info=talep_kalemleri_with_siparis_info,
                               satinalma=satinalma,
                               satinalma_id=satinalma_id,
                               proje=proje,
                               actions_info=actions_info,
                               states_info=states_info)
Exemple #19
0
class ProjeDashboardView(FlaskView):
    """
    Proje Dashboard
    """
    @login_required
    @auth.requires(
        Permission(*permission_dict["bap"]["proje"]["dashboard"]
                   ["proje_ozeti_goruntuleme"]),
        Or(ProjeYurutucusu(), Role('BAP Yetkilisi'), Role('BAP Admin'),
           AtanmisHakem()))
    @route("<int:proje_id>/dashboard/ozet",
           methods=["GET", "POST"],
           endpoint="proje_dashboard")
    def proje_dashboard(self, proje_id):
        """
        Proje özeti bilgilerine ulaşmak için kullanılır
        Args:
            proje_id(int): proje id si

        Returns:

        """
        proje_yurutucusu_mu = ProjeYurutucusu().fulfill(user=current_user)
        atanmis_hakem = AtanmisHakem()
        sozlesme_ekle_form = SozlesmeYukleForm()

        try:
            proje = DB.session.query(Proje).options(
                joinedload(Proje.proje_proje_turu).load_only("ad"),
                joinedload(Proje.proje_yurutucu).load_only("id").joinedload(
                    OgretimElemani.personel).load_only("id").joinedload(
                        Personel.person).load_only("ad", "soyad"),
                joinedload(Proje.fakulte).load_only("ad"),
                joinedload(Proje.bolum).load_only("ad"),
                joinedload(Proje.ana_bilim_dali).load_only("ad"),
                joinedload(Proje.bilim_dali).load_only("ad"),
                lazyload(Proje.proje_detayi),
                lazyload(Proje.kabul_edilen_proje_hakemleri),
                lazyload(Proje.proje_hakem_onerileri),
                lazyload(Proje.proje_destekleyen_kurulus),
                joinedload(Proje.proje_kalemleri).lazyload("*"),
            ).filter(
                Proje.id == proje_id,
                or_(
                    Proje.proje_basvuru_durumu ==
                    ProjeBasvuruDurumu.tamamlandi, Proje.proje_basvuru_durumu
                    == ProjeBasvuruDurumu.revizyon_bekleniyor)).first()

            toplam_butce = Decimal("0.00")
            rezerv_butce = Decimal("0.00")
            kullanilan_butce = Decimal("0.00")
            for proje_kalemi in proje.proje_kalemleri:
                toplam_butce += proje_kalemi.toplam_butce
                rezerv_butce += proje_kalemi.rezerv_butce
                kullanilan_butce += proje_kalemi.kullanilan_butce

            kullanilabilir_butce = toplam_butce - rezerv_butce - kullanilan_butce
            kullanilabilir_butce = kullanilabilir_butce.quantize(
                Decimal(".01"))

            proje_durum = ProjeStateDispacther.current_state_info(
                proje_id=proje.id)

            possible_next_states = ProjeStateDispacther.possible_next_states_info(
                current_app_state_id=proje_durum.id)

            possible_actions = ProjeStateDispacther.possible_actions(
                current_app_state_id=proje_durum.id)

            actions_info = DB.session.query(AppAction).filter(
                AppAction.action_code.in_(possible_actions)).all()

            states_info = DB.session.query(AppState). \
                filter(AppState.state_code.in_(possible_next_states)).all()

            genel_uyari_mesajlari = proje.proje_proje_turu.genel_uyari_mesajlari
            sozlesme_sablon_id = proje.proje_proje_turu.sozlesme_sablon_id

            proje_durumlari = DB.session.query(
                AppState.state_code.label("state_code"),
                AppState.description.label("state_description"),
                AppState.current_app_state.label("current_app_state"),
            ).filter(AppState.state_type == StateTypes.proje).options(
                lazyload("*")).order_by(AppState.id).all()

            proje_islemleri = DB.session.query(
                AppAction.action_code.label("action_code"),
                AppAction.description.label("action_description"),
            ).filter(AppAction.action_type == ActionTypes.proje).order_by(
                AppAction.id).all()

        except SQLAlchemyError as exc:
            CustomErrorHandler.error_handler(
                hata=
                "Proje dashboard ekranı yüklenirken database sorgularında sorun oluştu "
                "Hata: {}, User id: {}, Proje id: {}".format(
                    exc, current_user.id, proje_id))

            return abort(500)

        # proje.proje_durum
        if not proje:
            pass
            # todo: proje bulunamadı hatası dön
        return render_template("dashboard/proje_ozeti.html",
                               proje=proje,
                               states_info=states_info,
                               actions_info=actions_info,
                               proje_durum=proje_durum,
                               sozlesme_ekle_form=sozlesme_ekle_form,
                               proje_yurutucusu_mu=proje_yurutucusu_mu,
                               atanmis_hakem=atanmis_hakem,
                               genel_uyari_mesajlari=genel_uyari_mesajlari,
                               kullanilabilir_butce=kullanilabilir_butce,
                               kullanilan_butce=kullanilan_butce,
                               rezerv_butce=rezerv_butce,
                               toplam_butce=toplam_butce,
                               proje_durumlari=proje_durumlari,
                               proje_islemleri=proje_islemleri,
                               sozlesme_sablon_id=sozlesme_sablon_id)

    @login_required
    @auth.requires(
        Permission(*permission_dict["bap"]["proje"]["dashboard"]
                   ["proje_ozeti_goruntuleme"]),
        Or(ProjeYurutucusu(), Role('BAP Yetkilisi'), Role('BAP Admin')))
    @route("<int:proje_id>/proje_ek/<int:ek_id>",
           methods=["POST"],
           endpoint='proje_eki')
    def proje_ekleri(self, proje_id, ek_id):
        """
        Proje eklerini indirmek icin kullanilir
        Args:
            self:
            proje_id(int): proje idsi
            belge_id(int): projenin belge idsi

        Returns:

        """
        proje = get_proje_with_related_fields(proje_id=proje_id)
        proje_ek = DB.session.query(ProjeBelgeleri).filter_by(
            belge_id=ek_id).first()

        # for belge in proje.proje_belgeleri:
        # if request.method == "POST" and request.form.get(ek.baslik) == str(ek.belge_id):
        context = {**proje.__dict__, 'proje_detay': proje.proje_detayi}

        renderer = TRenderer(template=proje_ek.belge.file_object,
                             context=context)
        rendered_document = renderer.render_document()

        signal_payload = {
            "message_type":
            USER_ACTIVITY_MESSAGES.get("bap").get(
                "proje_eki_indirildi").type_index,
            "nesne":
            'Proje Belgeleri',
            "nesne_id":
            ek_id,
            "etkilenen_nesne":
            "Proje",
            "etkilenen_nesne_id":
            proje_id,
            "ekstra_mesaj":
            "{} adlı kullanıcı, {} adlı proje ekini indirdi.".format(
                current_user.username, proje_ek.belge.content.file.filename)
        }
        signal_sender(**signal_payload)

        return send_file(
            BytesIO(rendered_document),
            as_attachment=True,
            attachment_filename=proje_ek.belge.content.file.filename,
            mimetype='application/vnd.oasis.opendocument.text')

    @staticmethod
    @login_required
    @auth.requires(
        Permission(*permission_dict["bap"]["proje"]["dashboard"]
                   ["proje_sozlesmesi_yukleme"]))
    @route("/dashboard/<int:proje_id>/sozlesme_yukle",
           methods=["POST"],
           endpoint="sozlesme_yukle")
    def proje_sozlesmesi_yukle(proje_id):
        """
        Proje sozlemesini Yukleme
        """
        try:
            sozlesme_formu = SozlesmeYukleForm(request.form)
            if sozlesme_formu.validate():
                sozlesme_file = request.files.get(
                    sozlesme_formu.sozlesme_file.name, None)
                if sozlesme_file:
                    file = File(content=sozlesme_file, user_id=current_user.id)
                    DB.session.add(file)
                    DB.session.flush()
                    proje = DB.session.query(Proje).filter(
                        Proje.id == proje_id).first()
                    sozlesme_var_mi = True if proje.proje_sozlesme_id else False
                    proje.proje_sozlesme_id = file.id
                    DB.session.commit()
                    flash(
                        _("Proje Sözleşmesi başarılı bir şekilde yüklenmiştir."
                          ))

                    if sozlesme_var_mi:
                        user_activity_message = _(
                            "Proje Sözleşmesi Güncellendi")
                    else:
                        user_activity_message = _("Proje Sözleşmesi Yüklendi")

                    revizyon_signal_payload = {
                        "message_type":
                        USER_ACTIVITY_MESSAGES.get("bap").get(
                            "proje_sozlesmesi_yuklendi").type_index,
                        "nesne":
                        'Proje',
                        "nesne_id":
                        proje_id,
                        "ekstra_mesaj":
                        "{} adlı kullanıcı, {} numaralı projeye sözleşme yükledi"
                        .format(current_user.username, proje.proje_no)
                    }

                    signal_sender(**revizyon_signal_payload)

                    for bap_admin in bap_yetkili_and_admin_ids():
                        payload = {
                            "message_type":
                            USER_ACTIVITY_MESSAGES.get("bap").get(
                                "proje_sozlesmesi_yuklendi").type_index,
                            "ekstra_mesaj":
                            "{} id li projeye sözleşme yüklendi".format(
                                proje.id),
                            "notification_receiver":
                            bap_admin.person_id,
                            "notification_title":
                            user_activity_message,
                            "notification_message":
                            "{} numaralı projenin sözleşmesi {} adlı kullanıcı"
                            " tarafından yüklendi.".format(
                                proje.proje_no, current_user.username),
                            "proje_id":
                            proje.id
                        }

                        signal_sender(log=False, notification=True, **payload)
                else:
                    flash(_("Lütfen proje sözleşmesi yükleyiniz"))
            else:
                flash(_("Sözleşme kaydedilemedi."))
                flash(sozlesme_formu.sozlesme_file.errors[0])
        except Exception as exc:
            DB.session.rollback()
            CustomErrorHandler.error_handler(
                hata="Proje sözleşmesi yüklenirken bir hata meydana geldi"
                "Hata: {}".format(exc))
        return redirect(url_for("proje.proje_dashboard", proje_id=proje_id))

    @staticmethod
    @login_required
    @auth.requires(Or(Role("BAP Admin"), Role("BAP Yetkilisi")))
    @route("/dashboard/<int:proje_id>/",
           methods=["POST"],
           endpoint="proje_durum_degistir")
    def proje_durum_degistir(proje_id):
        kod = request.get_json()['kod']

        template = project_management_methods_get[kod](proje_id=proje_id,
                                                       code=kod)

        return jsonify(status="success", template=template)

    @staticmethod
    @login_required
    @auth.requires(Or(Role("BAP Admin"), Role("BAP Yetkilisi")))
    @route("/<int:proje_id>", methods=["POST"], endpoint="proje_durum_kaydet")
    def proje_durum_kaydet(proje_id):

        request_json = request.get_json()
        form = request_json['form']
        kod = request_json['kod']

        try:
            template = project_management_methods_post[kod](proje_id=proje_id,
                                                            code=kod,
                                                            form=form)
            if not template:
                return jsonify(status="success")

            if type(template) is str:
                return jsonify(status="error",
                               template=template,
                               code=kod,
                               hata_mesaji=""), 400
            return jsonify(
                status="error",
                template=template[0],
                code=kod,
                hata_mesaji=template[1] if len(template) > 1 else ""), 400

        except Exception as exc:
            DB.session.rollback()
            CustomErrorHandler.error_handler(
                hata="Proje ile ilgili işlem yapılırken bir hata oluştu"
                "Hata: {}, Proje id: {}".format(exc, proje_id))
            return jsonify(status="error", template=None), 500
Exemple #20
0
class SatinAlmaTalepleriView(FlaskView):
    """Bap Satinalma Talepleri view class"""

    excluded_methods = ["qry"]

    @property
    def qry(self):
        """
                Proje ve ilgili alanlari icin query nesnesi olustur.
                Returns:
                """
        return DB.session.query(ProjeSatinAlmaTalebi).join(
            Proje, Proje.id == ProjeSatinAlmaTalebi.proje_id
        ).join(OgretimElemani, Proje.yurutucu == OgretimElemani.id).join(
            Personel, OgretimElemani.personel_id ==
            Personel.id).join(Person, Person.id == Personel.person_id).join(
                ProjeTuru, ProjeTuru.id == Proje.proje_turu).join(
                    AppState,
                    ProjeSatinAlmaTalebi.durum_id == AppState.id).add_columns(
                        ProjeSatinAlmaTalebi.id,
                        ProjeSatinAlmaTalebi.created_at.label("talep_tarihi"),
                        Proje.proje_no.label("proje_no"), Person.ad,
                        Person.soyad,
                        AppState.state_code.label("satinalma_durumu"),
                        ProjeTuru.ad.label("proje_turu_ad"))

    def process_data(self, result, form_data, total_record):
        data = [[
            index + 1, r.proje_no if r.proje_no else '-', r.satinalma_durumu,
            "{} {}".format(r.ad,
                           r.soyad), '{:%d.%m.%Y}'.format(r.talep_tarihi), """
            <a class="detail_arrow" href="{}"><span class="fa fa-arrow-circle-right fa-2x "></span>
                </a>
                """.format(
                               url_for('satinalma.satinalma_dashboard',
                                       satinalma_id=r.id))
        ] for index, r in enumerate(result)]

        return jsonify({
            "data": data,
            "draw": form_data['draw'],
            "recordsFiltered": len(result),
            "recordsTotal": total_record
        })

    @login_required
    @route('/liste', methods=['GET'])
    @auth.requires(Permission(*permission_dict["bap"]["satinalma"]
                              ["satınalma_talepleri_listesi_goruntuleme"]),
                   menu_registry={
                       "path": ".bap.satinalma.satinalma_talepleri",
                       "title": _("Talepler")
                   })
    def satinalma_talepleri_listele(self):
        search_form = SatinalmaTalepSearchForm()
        return render_template('satinalma_talepleri.html', form=search_form)

    @login_required
    @auth.requires(
        Or(
            Permission(*permission_dict["bap"]["satinalma"]
                       ["satınalma_talepleri_listesi_goruntuleme"]),
            Or(Role("BAP Admin"), Role("BAP Yetkilisi"))))
    @route('/data', methods=["POST"], endpoint="satinalma_search")
    def satilama_talebi_ara(self):  # pylint: disable=too-many-branches
        """
        Bap projelerinde POST ile gelen parametrelere gore arama yapip, sonuclari dondurur.
        Returns:
            http response
        """
        qry = self.qry
        total_record = qry.count()
        form_data = request.form.to_dict()
        search_form = SatinalmaTalepSearchForm(**form_data)

        talep_durumu = search_form.talep_durumu.data

        satinalma_sureci = search_form.satinalma_sureci.data

        if satinalma_sureci == "-1":
            qry = qry.filter(
                or_((AppState.current_app_state == 'basvuru_kabul'),
                    (AppState.current_app_state == 'devam'),
                    (AppState.current_app_state == 'son')))
        if satinalma_sureci == 'AppStates.basvuru_kabul':
            qry = qry.filter(AppState.current_app_state == 'basvuru_kabul')
        if satinalma_sureci == 'AppStates.devam':
            qry = qry.filter(AppState.current_app_state == 'devam')
        if satinalma_sureci == 'AppStates.son':
            qry = qry.filter(AppState.current_app_state == 'son')

        if talep_durumu != '0' and talep_durumu != 'None':
            qry = qry.filter(AppState.id == int(talep_durumu))

        if not search_form.validate():
            result = qry.order_by(desc(ProjeSatinAlmaTalebi.id)).offset(
                form_data['start']).limit(form_data['length']).all()
            return self.process_data(result, form_data, total_record)

        proje_no = search_form.proje_no.data
        talep_tarihi = search_form.date.talep_tarihi.data
        talep_tarihi_option = search_form.date.talep_tarihi_option.data
        yurutucu = search_form.yurutucu.data
        proje_turu_adi = search_form.proje_turu_adi.data

        if proje_no:
            qry = qry.filter(Proje.proje_no.ilike('%' + proje_no + '%'))

        if yurutucu:
            qry = qry.filter(Person.ad.ilike('%' + yurutucu + '%'))

        if proje_turu_adi:
            qry = qry.filter(ProjeTuru.ad.ilike('%' + yurutucu + '%'))

        if talep_tarihi:
            if talep_tarihi_option == '0':
                qry = qry.filter(
                    ProjeSatinAlmaTalebi.created_at >= talep_tarihi)
            if talep_tarihi_option == '1':
                qry = qry.filter(
                    ProjeSatinAlmaTalebi.created_at == talep_tarihi)
            if talep_tarihi_option == '2':
                qry = qry.filter(ProjeSatinAlmaTalebi.created_at <=
                                 Proje.kabul_edilen_baslama_tarihi)

        result = qry.order_by(desc(ProjeSatinAlmaTalebi.id)).offset(
            form_data['start']).limit(form_data['length']).all()

        return self.process_data(result, form_data, total_record)
Exemple #21
0
        user_groups = {g.id for g in user.groups}
        return bool(forum_groups & user_groups)


def IsAtleastModeratorInForum(forum_id=None, forum=None):
    return Or(
        IsAtleastSuperModerator,
        IsModeratorInForum(forum_id=forum_id, forum=forum),
    )


IsMod = And(IsAuthed(), Has("mod"))
IsSuperMod = And(IsAuthed(), Has("super_mod"))
IsAdmin = And(IsAuthed(), Has("admin"))

IsAtleastModerator = Or(IsAdmin, IsSuperMod, IsMod)

IsAtleastSuperModerator = Or(IsAdmin, IsSuperMod)

CanBanUser = Or(IsAtleastSuperModerator, Has("mod_banuser"))

CanEditUser = Or(IsAtleastSuperModerator, Has("mod_edituser"))

CanEditPost = Or(
    IsAtleastSuperModerator,
    And(IsModeratorInForum(), Has("editpost")),
    And(CanAccessForum(), IsSameUser(), Has("editpost"), TopicNotLocked()),
)

CanDeletePost = CanEditPost