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, )
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
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
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
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
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)