Example #1
0
def app_state_tracker(pid=None):
    """
        App State Tracker bilgilerini ekler

        """
    return AppStateTracker(
        state_id=pid,
        params=random.choice([ap for ap in APP_STATE_PARAMS]),
        date=datetime.now(),
        description=f.sentence(),
        job_type=JobTypes.project_state_change,
        triggered_by=pid,
    )
Example #2
0
    def prepare_tracker(state_id=None, job_id=None, tracker_info=None):
        if not isinstance(tracker_info, dict):
            return None

        new_tracker = AppStateTracker(
            state_id=state_id,
            params=tracker_info.get('params', None),
            date=datetime.now(),
            job_type=tracker_info.get('job_type', None),
            triggered_by=tracker_info.get("triggered_by", None),
            description=tracker_info.get("description", None),
            apscheduler_job_id=job_id)
        return new_tracker
Example #3
0
    def state_change(self,
                     next_app_state_code=None,
                     triggered_by=None,
                     bap_yetkilisi_notu=None,
                     description='',
                     email_gonderilsin_mi=None,
                     yurutucu_log=None):

        try:
            next_state_info = self.state_change_checker(
                next_app_state_code=next_app_state_code)

        except Exception as e:
            raise Exception(e)

        if next_state_info.app_state_id:
            try:
                app_state_tracker = AppStateTracker(
                    state_id=next_state_info.app_state_id,
                    params={
                        'proje_id': self.entity.proje_id,
                        'satinalma_id': self.entity.id
                    },
                    date=datetime.now(),
                    job_type=JobTypes.satinalma_state_change,
                    triggered_by=triggered_by,
                    description="{} {}".format(
                        next_state_info.app_state_description, description))

                entity_model = DB.session.query(self.entity_type).filter(
                    self.entity_type.id == self.entity.id).first()
                entity_model.durum_id = next_state_info.app_state_id
                DB.session.add(app_state_tracker)

                payload = {
                    "message_type":
                    USER_ACTIVITY_MESSAGES.get("bap").get(
                        "satinalma_durum_degisimi").type_index,
                    "ekstra_mesaj":
                    "{} id li {} durumu {} yapildi.".format(
                        self.entity.__repr__(), self.entity.id,
                        next_state_info.app_state_description),
                    "nesne":
                    '{}'.format(self.entity.__repr__()),
                    "nesne_id":
                    self.entity.id,
                }

                signal_sender(notification=True, **payload)

                proje = DB.session.query(Proje).filter(
                    Proje.id == self.entity.proje_id).first()
                yurutucu_person_id = proje.proje_yurutucu.person.id

                satinalma = DB.session.query(
                    ProjeSatinAlmaTalebi.talep_numarasi.label(
                        "talep_numarasi")).options(lazyload("*")).filter(
                            ProjeSatinAlmaTalebi.id == self.entity.id).first()

                if yurutucu_log:
                    payload = {
                        "message_type":
                        USER_ACTIVITY_MESSAGES.get("bap").get(
                            "satinalma_durum_degisimi").type_index,
                        "ekstra_mesaj":
                        "{} id'li projenin  id'li {} satinalma talebi {} yapildi."
                        .format(proje.id, self.entity.id,
                                next_state_info.app_state_description),
                        "notification_receiver":
                        yurutucu_person_id,
                        "notification_title":
                        next_state_info.app_state_description,
                        "notification_message":
                        "{} numaralı projenin {} numaralı satınalma "
                        "talebinde yapılan durum değişimi için bap yetkili "
                        "notu; {}".format(proje.proje_no,
                                          satinalma.talep_numarasi,
                                          yurutucu_log),
                        "proje_id":
                        proje.id,
                        "related_table":
                        "proje_mesaj"
                    }

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

                    if email_gonderilsin_mi:
                        SatinalmaStateDispatcher.email_gonder(
                            proje=proje,
                            subject=next_state_info.app_state_description,
                            content_text=
                            "{} numaralı projenin {} numaralı satınalma "
                            "talebinde yapılan durum değişimi için bap yetkili "
                            "notu; {}".format(proje.proje_no,
                                              satinalma.talep_numarasi,
                                              yurutucu_log),
                            greeting_name="{} {}".format(
                                proje.proje_yurutucu.person.ad,
                                proje.proje_yurutucu.person.soyad))

                for bap_admin in bap_yetkili_and_admin_ids():
                    payload = {
                        "message_type":
                        USER_ACTIVITY_MESSAGES.get("bap").get(
                            "satinalma_durum_degisimi").type_index,
                        "ekstra_mesaj":
                        "{} id'li projenin  id'li {} satinalma talebi {} yapildi."
                        .format(proje.id, self.entity.id,
                                next_state_info.app_state_description),
                        "notification_receiver":
                        bap_admin.person_id,
                        "notification_title":
                        next_state_info.app_state_description,
                        "notification_message":
                        "{} numaralı projenin {} numaralı satınalma "
                        "talebi için durum değişimi yapıldı.{}".format(
                            proje.proje_no, satinalma.talep_numarasi,
                            bap_yetkilisi_notu
                            or next_state_info.app_state_description),
                    }

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

                DB.session.commit()
            except Exception as exc:
                raise Exception(exc)

        else:
            raise ValueError("Could not find next possible state's id.")

        return next_state_info.app_state_id
Example #4
0
    def firma_tekllif_teknik_sartname_degerlendirmesi(satinalma_id,
                                                      talep_kalemi_id,
                                                      firma_teklif_kalemi_id):
        """
        Firma teklif kaleminin ilgili teknikşartnameye uygunlugunun degistirildigi view methodu
        :param satinalma_id: satinalma id
        :param talep_kalemi_id: satınalma talep kalemi id
        :param firma_teklif_kalemi_id: firma teklif kalemi id
        """

        try:
            # sadece st6 durumunda bu işlemin yapilmasini saglanir
            satinalma = DB.session.query(ProjeSatinAlmaTalebi).options(
                joinedload(ProjeSatinAlmaTalebi.durumu), lazyload("*")).filter(
                    ProjeSatinAlmaTalebi.id == satinalma_id).first()

            if not satinalma.durumu.id == 39:
                return jsonify(
                    status="error",
                    error_message="Sadece \"{}\" durumunda bu işlemi "
                    "gerçekleştirebilirsin".format(
                        satinalma.durumu.description)), 405
            teknik_sartnameye_uygun_mu = request.get_json().get("uygunMu")

            if teknik_sartnameye_uygun_mu is None:
                return jsonify("error"), 500

            firma_teklif = DB.session.query(FirmaTeklifKalemi).options(
                joinedload(FirmaTeklifKalemi.satinalma_teklif).joinedload(
                    FirmaSatinalmaTeklif.firma).joinedload(
                        BapFirma.user).joinedload(User.person).load_only("id"),
                joinedload(FirmaTeklifKalemi.satinalma_teklif).lazyload("*"),
                joinedload(
                    FirmaTeklifKalemi.satinalma_talep_kalemi).joinedload(
                        TalepKalemleri.proje_kalemi).load_only("ad")
            ).filter(
                FirmaTeklifKalemi.satinalma_talep_kalemi_id == talep_kalemi_id,
                FirmaTeklifKalemi.id == firma_teklif_kalemi_id).first()

            if not firma_teklif:
                return jsonify(
                    status="error",
                    error_message="Böyle bir teklif bulunamadı"), 404

            firma_teklif.teknik_sartname_uygunlugu = TeknikSartnameUygunlukDegerlendirmesi.uygun if \
                teknik_sartnameye_uygun_mu else TeknikSartnameUygunlukDegerlendirmesi.uygun_degil

            state_tracker = AppStateTracker(
                state_id=satinalma.durum_id,
                triggered_by=current_user.id,
                params={
                    "proje_id": satinalma.proje_id,
                    "satinalma_id": satinalma.id
                },
                date=datetime.now(),
                description=
                "Firma teklifi teknik şartname uygunluğu değerlendirildi",
                job_type=JobTypes.satinalma_action)
            DB.session.add(state_tracker)

            DB.session.commit()

            ekstra_mesaj = "{} id li firma teklifinin teknik şartname uygunluğu {} olarak " \
                           "değiştirildi.".format(firma_teklif.id,
                                                  firma_teklif.teknik_sartname_uygunlugu.value)
            signal_payload = {
                "message_type":
                USER_ACTIVITY_MESSAGES.get("bap").get(
                    "firma_teklif_teknik_sartname_degerlendirmesi").type_index,
                "nesne":
                "FirmaTeklifKalemi",
                "ekstra_mesaj":
                ekstra_mesaj
            }
            signal_sender(**signal_payload)

            payload = {
                "notification_receiver":
                firma_teklif.satinalma_teklif.firma.user.person.id,
                "notification_title":
                "Teknik Şartnameye Uygunluk Değerlendirildig",
                "notification_message":
                "{} numaralı satınalma talebinin {} isimli kalemine "
                "yaptığınız teklifin teknik şartnameye uygunluğu {} olarak "
                "belirlendi".format(
                    satinalma.talep_numarasi,
                    firma_teklif.satinalma_talep_kalemi.proje_kalemi.ad,
                    firma_teklif.teknik_sartname_uygunlugu.value),
            }

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

            return jsonify(status="success")

        except Exception as exc:
            CustomErrorHandler.error_handler(
                hata=
                "Firma teklifi teknik şartname uygunlugu değerlendirilirken bir hata oluştu."
                "Hata: {}, Satinalma id: {}, Firma Teklif Kalemi Id: {}".
                format(satinalma_id, exc, firma_teklif_kalemi_id))
            return jsonify(status="error"), 500
Example #5
0
    def firma_teklif_sil(self, satinalma_id, siparis_takip_id):
        try:
            # sadece st6 durumunda bu işlemin yapilmasini saglanir
            satinalma = DB.session.query(ProjeSatinAlmaTalebi).options(
                joinedload(ProjeSatinAlmaTalebi.durumu), lazyload("*")).filter(
                    ProjeSatinAlmaTalebi.id == satinalma_id).first()

            if not satinalma.durumu.id == 39:
                return jsonify(
                    status="error",
                    error_message="Sadece \"{}\" durumunda bu işlemi "
                    "gerçekleştirebilirsin".format(
                        satinalma.durumu.description)), 405

            siparis_takip = DB.session.query(SiparisTakip).filter(
                SiparisTakip.id == siparis_takip_id).options(
                    joinedload(SiparisTakip.kazanan_firma_teklif),
                    joinedload(SiparisTakip.satinalma_talep_kalemleri),
                ).first()

            if not siparis_takip:
                return jsonify(status="error",
                               error_message="İlgili siparis bulunamadı"), 404

            # proje kaleminin rezerv butcesi firmanin kdv dahil teklifi kadar azaltilir
            firma_teklif = siparis_takip.kazanan_firma_teklif
            proje_kalemi = siparis_takip.satinalma_talep_kalemleri.proje_kalemi

            kdv_dahil_teklif = kdv_dahil_fiyat_hesabi(firma_teklif.teklif,
                                                      firma_teklif.kdv_orani)

            proje_kalemi.rezerv_butce = proje_kalemi.rezerv_butce - kdv_dahil_teklif

            DB.session.delete(siparis_takip)
            state_tracker = AppStateTracker(
                state_id=satinalma.durum_id,
                triggered_by=current_user.id,
                params={
                    "proje_id": satinalma.proje_id,
                    "satinalma_id": satinalma.id
                },
                date=datetime.now(),
                description="Kabul edilen firma teklifi iptal edildi",
                job_type=JobTypes.satinalma_action)
            DB.session.add(state_tracker)
            DB.session.commit()

            ekstra_mesaj = "{} id li talep kalemi için kabul edilen {} id li firma teklif kalemi " \
                           "iptal edildi.".format(siparis_takip.satinalma_talep_kalemleri_id,
                                                  siparis_takip.kazanan_firma_teklif_id)
            signal_payload = {
                "message_type":
                USER_ACTIVITY_MESSAGES.get("bap").get(
                    "kabul_edilen_firma_teklifi_silindi").type_index,
                "nesne":
                "SiparisTakip",
                "ekstra_mesaj":
                ekstra_mesaj
            }
            signal_sender(**signal_payload)

            return jsonify(status="success")

        except Exception as exc:
            DB.session.rollback()
            CustomErrorHandler.error_handler(
                hata=
                "Kabul edilen firma teklifi iptal edilirken beklenmedik bir hata oluştu."
                "Hata: {}, Satinalma id: {}".format(satinalma_id, exc))
            return jsonify(status="error"), 500
Example #6
0
    def firma_teklif_kabul_et(self, satinalma_id, talep_kalemi_id,
                              firma_teklif_kalemi_id):
        try:
            # sadece st6 durumunda bu işlemin yapilmasini saglanir
            satinalma = DB.session.query(ProjeSatinAlmaTalebi).options(
                joinedload(ProjeSatinAlmaTalebi.durumu), lazyload("*")).filter(
                    ProjeSatinAlmaTalebi.id == satinalma_id).first()

            if not satinalma.durumu.id == 39:
                return jsonify(
                    status="error",
                    error_message="Sadece \"{}\" durumunda bu işlemi "
                    "gerçekleştirebilirsin".format(
                        satinalma.durumu.description)), 405

            # ilgili talep kalemi icin daha önce bir teklifi kabul etmis ise gerekli hata
            # mesaji donulur
            siparis_takip = DB.session.query(SiparisTakip).filter(
                SiparisTakip.kazanan_firma_teklif_id == firma_teklif_kalemi_id,
                SiparisTakip.satinalma_talep_kalemleri_id ==
                talep_kalemi_id).first()

            if siparis_takip:
                return jsonify(
                    status="error",
                    error_message="İlgili talep kalemi için kabul edilmis "
                    "bir teklif mevcut. Başka bir teklif kabul etmek "
                    "için daha önce kabul ettiğiniz teklifi iptal ediniz"), 409

            firma_teklif_kalemi = DB.session.query(FirmaTeklifKalemi).filter(
                FirmaTeklifKalemi.id == firma_teklif_kalemi_id,
                FirmaTeklifKalemi.satinalma_talep_kalemi_id ==
                talep_kalemi_id).first()

            if not firma_teklif_kalemi:
                return jsonify(
                    status="error",
                    error_message="Böyle bir teklif bulunamadı"), 404

            # siparis numarasi proje numarasi, firma_teklif_kalemi_id ve talep_kalemi_id nin
            # birlesiminden olusur
            siparis_numarasi = "{}{}{}".format(satinalma.proje_id,
                                               firma_teklif_kalemi_id,
                                               talep_kalemi_id)
            yeni_siparis_takip = SiparisTakip(
                satinalma_talep_kalemleri_id=talep_kalemi_id,
                kazanan_firma_teklif_id=firma_teklif_kalemi_id,
                siparis_numarasi=siparis_numarasi)

            DB.session.add(yeni_siparis_takip)
            talep_kalemi = DB.session.query(TalepKalemleri).filter(
                TalepKalemleri.id == talep_kalemi_id).first()

            # proje kaleminde bulunan rezerv butce kdv dahil firma teklifi kadar artirilir
            proje_kalemi = talep_kalemi.proje_kalemi
            kullanilabilir_butce = proje_kalemi_kullanilabilir_butce_hesapla(
                proje_kalemi)
            teklif_kdv_dahil_tutari = kdv_dahil_fiyat_hesabi(
                firma_teklif_kalemi.teklif, firma_teklif_kalemi.kdv_orani)
            if not (kullanilabilir_butce >= teklif_kdv_dahil_tutari):
                # eger yeterli kullanilabilir butce yoksa kullanıcıya hata donulur
                return jsonify(
                    status="error",
                    error_message=
                    "Proje kaleminin yeterli kullanılabilir bütçesi bulunmamakta. "
                    "Proje kaleminin kullanılabilir bütcesi {}, firmanın kdv dahil "
                    "teklif tutarı {}".format(kullanilabilir_butce,
                                              teklif_kdv_dahil_tutari)), 404

            proje_kalemi.rezerv_butce = proje_kalemi.rezerv_butce + teklif_kdv_dahil_tutari

            state_tracker = AppStateTracker(
                state_id=satinalma.durum_id,
                triggered_by=current_user.id,
                params={
                    "proje_id": satinalma.proje_id,
                    "satinalma_id": satinalma.id
                },
                date=datetime.now(),
                description="Firma teklifi kabul edildi",
                job_type=JobTypes.satinalma_action)
            DB.session.add(state_tracker)

            DB.session.commit()

            ekstra_mesaj = "{} id li talep kalemi için {} id li firma teklifi kabul edildi. {} id " \
                           "li siparis takip kaydı oluşturuldu".format(talep_kalemi_id,
                                                                       firma_teklif_kalemi_id,
                                                                       yeni_siparis_takip.id)
            signal_payload = {
                "message_type":
                USER_ACTIVITY_MESSAGES.get("bap").get(
                    "firma_teklifi_kabul_edildi").type_index,
                "nesne":
                "SiparisTakip",
                "nesne_id":
                yeni_siparis_takip.id,
                "ekstra_mesaj":
                ekstra_mesaj
            }
            signal_sender(**signal_payload)

            return jsonify(status="success")
        except Exception as exc:
            DB.session.rollback()
            CustomErrorHandler.error_handler(
                hata="Firma teklifi kabul edilirken beklenmedik bir hata oluştu."
                "Hata: {}, Satinalma id: {}, Firma Teklif Kalemi Id: {}".
                format(satinalma_id, exc, firma_teklif_kalemi_id))
            return jsonify(status="error"), 500
    def do_action(proje_id=None, action_code=None, params=None, triggered_by=None,
                  bap_yetkilisi_notu=None,
                  description='', email_gonderilsin_mi=None, yurutucu_log=None):
        try:
            current_state_info = ProjeStateDispacther.current_state_info(proje_id=proje_id)

            action_info = ProjeStateDispacther.do_action_checker(
                current_app_state_id=current_state_info.id,
                action_code=action_code)

        except Exception as e:
            raise Exception(e)

        if action_info.app_action_id:
            try:
                app_state_tracker = AppStateTracker(
                    state_id=current_state_info.id,
                    params=params,
                    date=datetime.now(),
                    job_type=JobTypes.project_action,
                    triggered_by=triggered_by,
                    description="{} {}".format(action_info.app_action_description, description)
                )

                DB.session.add(app_state_tracker)
                DB.session.commit()

                proje = DB.session.query(Proje).filter(Proje.id == proje_id).first()

                payload = {
                    "message_type": USER_ACTIVITY_MESSAGES.get("bap").get("proje_islem").type_index,
                    "ekstra_mesaj": "{} numaralı proje için {} işlemi yapıldı.".format(
                        proje.proje_no,
                        action_info.app_action_description),
                    "nesne": 'Proje',
                    "nesne_id": proje_id,
                }

                signal_sender(notification=True, **payload)

                if yurutucu_log:
                    yurutucu_person_id = proje.proje_yurutucu.person.id
                    payload = {
                        "message_type": USER_ACTIVITY_MESSAGES.get("bap").get(
                            "proje_islem").type_index,
                        "ekstra_mesaj": "{} numaralı proje için {} işlemi yapıldı.".format(
                            proje.proje_no,
                            action_info.app_action_description),
                        "notification_receiver": yurutucu_person_id,
                        "notification_title": action_info.app_action_description,
                        "notification_message": "{} numaralı proje için bap yetkilisi notu: {}".format(
                            proje.proje_no, yurutucu_log),
                        "proje_id": proje.id,
                        "related_table": "proje_mesaj"
                    }

                    signal_sender(log=False, notification=True, **payload)
                    if email_gonderilsin_mi:
                        ProjeStateDispacther.email_gonder(
                            proje=proje,
                            subject=action_info.app_action_description,
                            content_text="{} numaralı proje için bap yetkilisi notu; {} ".format(
                                proje.proje_no,
                                yurutucu_log),
                            greeting_name="{} {}".format(
                                proje.proje_yurutucu.person.ad,
                                proje.proje_yurutucu.person.soyad))

                for bap_admin in bap_yetkili_and_admin_ids():
                    payload = {
                        "message_type": USER_ACTIVITY_MESSAGES.get("bap").get(
                            "proje_islem").type_index,
                        "ekstra_mesaj": "{} numaralı proje için {} işlemi yapildi.".format(
                            proje.proje_no,
                            action_info.app_action_description),
                        "notification_receiver": bap_admin.person_id,
                        "notification_title": action_info.app_action_description,
                        "notification_message": "{} numaralı proje için işlem gerçekleşti. {}".format(
                            proje.proje_no,
                            bap_yetkilisi_notu or action_info.app_action_description),
                        "proje_id": proje.id
                    }

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

            except Exception as exc:
                raise Exception(exc)


        else:
            raise ValueError("Could not find next possible state's id.")
    def project_init(next_app_state_code='P1', params=None, triggered_by=None, proje_id=None,
                     email_gonderilsin_mi=None,
                     yurutucu_log=None):
        try:
            app_state_info = DB.session.query(AppState.id.label("app_state_id"),
                                              AppState.description.label("app_state_description")). \
                filter(AppState.state_code == next_app_state_code).first()

            app_state_tracker = AppStateTracker(
                state_id=app_state_info.app_state_id,
                params=params,
                date=datetime.now(),
                job_type=JobTypes.project_state_change,
                triggered_by=triggered_by,
                description=app_state_info.app_state_description,

            )
            DB.session.add(app_state_tracker)
            proje = DB.session.query(Proje).filter(Proje.id == proje_id).first()
            proje.proje_durumu_id = app_state_info.app_state_id

            DB.session.commit()

            payload = {
                "message_type": USER_ACTIVITY_MESSAGES.get("bap").get(
                    "proje_durum_degisimi").type_index,
                "ekstra_mesaj": "{} numaralı projenin durumu {} yapildi.".format(proje.proje_no,
                                                                                 app_state_info.app_state_description),
                "nesne": 'Proje',
                "nesne_id": proje_id,
            }

            signal_sender(notification=True, **payload)

            yurutucu_person_id = proje.proje_yurutucu.person.id
            payload = {
                "message_type": USER_ACTIVITY_MESSAGES.get("bap").get(
                    "proje_durum_degisimi").type_index,
                "ekstra_mesaj": "{} numaralı projenin durumu {} yapildi.".format(proje.proje_no,
                                                                                 app_state_info.app_state_description),
                "notification_receiver": yurutucu_person_id,
                "notification_title": app_state_info.app_state_description,
                "notification_message": "{} numaralı projenin yeni durumu: {} ".format(
                    proje.proje_no,
                    app_state_info.app_state_description),
                "proje_id": proje.id,
                "related_table": "proje_mesaj"
            }
            signal_sender(log=False, notification=True, **payload)

            for bap_admin in bap_yetkili_and_admin_ids():
                payload = {
                    "message_type": USER_ACTIVITY_MESSAGES.get("bap").get(
                        "proje_durum_degisimi").type_index,
                    "ekstra_mesaj": "{} numaralı projenin durumu {} yapildi.".format(proje.proje_no,
                                                                                     app_state_info.app_state_description),
                    "notification_receiver": bap_admin.person_id,
                    "notification_title": app_state_info.app_state_description,
                    "notification_message": "{} no su ile proje başvurusu yapıldı.{}".format(
                        proje.proje_no, app_state_info.app_state_description),
                    "proje_id": proje.id
                }

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

            if email_gonderilsin_mi:
                ProjeStateDispacther.email_gonder(proje=proje,
                                             subject=app_state_info.app_state_description,
                                             content_text=yurutucu_log,
                                             greeting_name="{} {}".format(
                                                 proje.proje_yurutucu.person.ad,
                                                 proje.proje_yurutucu.person.soyad))

            return True

        except Exception as exc:
            raise Exception(exc)