docs: function f_uyari_calistir(_uyari) {
  
          function Uyari(_uyarim) {
              this.alert = _uyarim;
              this.alert.RENDER = {
                  Uyeler: {
                      mail_listesi: [],
                      gsm_listesi: [],
                      id_listesi: [],
                      uye_listesi: []
                  },
                  Sonuc: {
                      Toplam: 0,
                      Data: []
                  },
                  ElasticQuery: {},
                  Tipi: "",
                  Hata: []
              };
          }
  
          //region ELASTİC SORGUSUNU HAZIRLA
          Uyari.prototype.f_ES_hazirla_ihale_tarihine_x_gun_kala = function () {
              var alert = this.alert;
              l.info("-----------f_ES_hazirla_ihale_tarihine_x_gun_kala----------------" + alert.Olay);
  
              if (alert.Kriterler && alert.Kriterler.length > 0) {
                  var bugun = new Date(),
                      gun = bugun.getDate(),
                      ay = bugun.getMonth(),
                      yil = bugun.getFullYear(),
                      tarih = new Date(yil, ay, gun),
                      kriter = alert.Kriterler[0],
                      baslangic_tarihi = null,
                      bitis_tarihi = null;
  
                  if (kriter.Prop == "Gun") {
                      baslangic_tarihi = tarih.f_addDays(kriter.Value);
                      bitis_tarihi = baslangic_tarihi.f_addDays(1);
                  } else if (kriter.Prop == "Ay") {
                      baslangic_tarihi = tarih.f_addDays(parseInt(kriter.Value) * 30);
                      bitis_tarihi = baslangic_tarihi.f_addDays(1);
                  }
  
                  var tipi = f_elastic_tipi(alert.Olay);
                  alert.RENDER.Tipi = tipi;
  
                  var db_ihale = require('./db_ihale');
                  return db_ihale.f_db_tahta_ihale_idler_aktif(alert.Tahta_Id)
                      .then(function (_idler) {
                          if (_idler && _idler != null) {
  
                              var sorgu = {
                                  "query": {
                                      "filtered": {
                                          "query": {
                                              "bool": {
                                                  "must": [
                                                      {
                                                          "ids": {
                                                              "type": tipi,
                                                              "values": _idler.map(function (e) {
                                                                  return e.toString()
                                                              })
                                                          }
                                                      }
                                                  ]
                                              }
                                          },
                                          "filter": {
                                              "bool": {
                                                  "must": [
                                                      {
                                                          "range": {
                                                              "IhaleTarihi": {
                                                                  "gte": baslangic_tarihi.getTime(),
                                                                  "lte": bitis_tarihi.getTime()
                                                              }
                                                          }
                                                      }
                                                  ]
                                              }
                                          }
                                      }
                                  }
                              };
                              alert.RENDER.ElasticQuery = sorgu;
                              return sorgu;
                          } else {
                              alert.RENDER.ElasticQuery = null;
                              return null;
                          }
                      });
              }
              else {
                  return null;
              }
          };
          Uyari.prototype.f_ES_hazirla_kalem_durumuna_gore = function () {
              //önce tahtanın görebileceği kalem_idlerini buluyoruz
              //sonra bu idlere göre onay durumu uyarıda ne tanımlandı ise ona uygun kalemleri içeren elastic sorgu oluşturuyoruz
  
              var alert = this.alert,
                  tipi = f_elastic_tipi(alert.Olay),
                  onay_durum_id = f_kalem_onay_durum_idsi(alert.Olay);
              l.info("------------------ f_ES_hazirla_kalem_durumuna_gore -------------- > " + alert.Olay);
              alert.RENDER.Tipi = tipi;
  
              var db_kalem = require('./db_kalem');
              return db_kalem.f_db_tahta_kalem_idler_aktif(alert.Tahta_Id)
                  .then(function (_idler) {
                      if (_idler && _idler != null) {
  
                          var sorgu = {
                              "query": {
                                  "filtered": {
                                      "query": {
                                          "bool": {
                                              "must": [
                                                  {
                                                      "ids": {
                                                          "type": tipi,
                                                          "values": _idler.map(function (e) {
                                                              return e.toString()
                                                          })
                                                      }
                                                  }
                                              ]
                                          }
                                      },
                                      "filter": {
                                          "bool": {
                                              "must": [
                                                  {
                                                      "term": {"OnayDurumu.Id": onay_durum_id}
                                                  }
                                              ]
                                          }
                                      }
                                  }
                              }
                          };
  
                          alert.RENDER.ElasticQuery = sorgu;
                          return sorgu;
                      } else {
                          alert.RENDER.ElasticQuery = null;
                          return null;
                      }
                  });
          };
          Uyari.prototype.f_ES_hazirla_teklif_durumuna_gore = function () {
              //önce tahtanın görebileceği teklif idleri buluyoruz
              //sonra bu idlere göre onay durumu uyarıda ne tanımlandı ise ona uygun teklifleri içeren elastic sorgu oluşturuyoruz
  
              var alert = this.alert,
                  tipi = f_elastic_tipi(alert.Olay),
                  onay_durum_id = f_teklif_onay_durum_idsi(alert.Olay);
              l.info("------------------ f_ES_hazirla_teklif_durumuna_gore -------------- > " + alert.Olay);
              alert.RENDER.Tipi = tipi;
  
              var db_tahta = require('./db_tahta');
              return db_tahta.f_db_tahta_teklif_idleri(alert.Tahta_Id)
                  .then(function (_idler) {
                      if (_idler && _idler != null) {
  
                          var sorgu = {
                              "query": {
                                  "filtered": {
                                      "query": {
                                          "bool": {
                                              "must": [
                                                  {
                                                      "ids": {
                                                          "type": tipi,
                                                          "values": _idler.map(function (e) {
                                                              return e.toString()
                                                          })
                                                      }
                                                  }
                                              ]
                                          }
                                      },
                                      "filter": {
                                          "bool": {
                                              "must": [
                                                  {
                                                      "term": {"Id": onay_durum_id}
                                                  }
                                              ]
                                          }
                                      }
                                  }
                              }
                          };
                          l.info("elastic SORGUMM > " + JSON.stringify(sorgu));
                          alert.RENDER.ElasticQuery = sorgu;
                          return sorgu;
                      } else {
                          alert.RENDER.ElasticQuery = null;
                          return null;
                      }
                  });
          };
          Uyari.prototype.f_ES_hazirla_diger = function () {
              var alert = this.alert,
                  tipi = f_elastic_tipi(alert.Olay);
              l.info("------------------ f_ES_hazirla_diger -------------- > " + alert.Olay);
              alert.RENDER.Tipi = tipi;
  
              return f_nesne_idleri(alert.Olay, alert.Tahta_Id)
                  .then(function (_idler) {
                      if (_idler != null) {
                          var query = f_elastic_filter(_idler, alert, alert.RENDER.Tipi);
                          alert.RENDER.ElasticQuery = query;
                          return query;
                      } else {
                          alert.RENDER.ElasticQuery = null;
                          return null;
                      }
                  });
          };
          Uyari.prototype.f_ES_hazirla = function () {
              var promise = null,
                  alert = this.alert;
  
              l.info("------------------ f_ES_hazirla -------------- > " + alert.Olay);
  
              //bazı uyarıların ElasticQuery değeri oluşturulmamış olabilir.
              //örneğin kalem:durum:katılıyoruz, ihale:tarih:x:gun:kala...
              //bu durumda elastic sorgusunu diğerlerinde göre daha farklı oluşturmalıyız
  
              switch (alert.Olay) {
                  case schema.SABIT.OLAY.IHALE_TARIHI_X_GUN_KALA:
                      promise = this.f_ES_hazirla_ihale_tarihine_x_gun_kala();
                      break;
  
                  case schema.SABIT.OLAY.KALEM_KATILIYORUZ:
                  case schema.SABIT.OLAY.KALEM_ITIRAZ_EDILECEK:
                  case schema.SABIT.OLAY.KALEM_ITIRAZ_EDILDI:
                  case schema.SABIT.OLAY.KALEM_ITIRAZ_KABUL:
                  case schema.SABIT.OLAY.KALEM_ITIRAZ_RED:
                  case schema.SABIT.OLAY.KALEM_IPTAL:
                      promise = this.f_ES_hazirla_kalem_durumuna_gore();
                      break;
  
                  case schema.SABIT.OLAY.TEKLIF_IHALEDEN_ATILDI:
                  case schema.SABIT.OLAY.TEKLIF_IPTAL:
                  case schema.SABIT.OLAY.TEKLIF_KAZANDI:
                  case schema.SABIT.OLAY.TEKLIF_URUN_BELGESI_EKSIK:
                  case schema.SABIT.OLAY.TEKLIF_URUNU_REDDEDILDI:
                      promise = this.f_ES_hazirla_teklif_durumuna_gore();
                      break;
  
                  default:
                      promise = this.f_ES_hazirla_diger();
                      break;
              }
  
              return promise;
          };
          //endregion
  
          //region ELASTİC SORGULA
          Uyari.prototype.f_ES_query = function () {
              var alert = this.alert,
                  defer = result.dbQ.Q.defer();
              l.info("------------------ f_ES_sorgula -------------- > " + alert.Olay);
              console.log("alert.RENDER.ElasticQuery>" + JSON.stringify(alert.RENDER.ElasticQuery))
  
              if (alert.RENDER.ElasticQuery != null) {
                  elastic.f_search({
                      method: "POST",
                      index: schema.SABIT.ELASTIC.INDEKS.APP,
                      type: alert.RENDER.Tipi,
                      body: alert.RENDER.ElasticQuery
                  }).then(function (_resp) {
  
                      alert.RENDER.Sonuc.Toplam = _resp[0].hits.total;
                      alert.RENDER.Sonuc.Data = _.map(_resp[0].hits.hits, "_source");
  
                      defer.resolve(_resp[0]);
                  });
              } else {
                  var hata = {id: 0, mesaj: "Elastic sorgusu oluşturulamadı!"};
                  alert.RENDER.Hata.push(hata);
                  defer.reject(hata);
              }
  
              return defer.promise;
          };
          //endregion
  
          //region UYARI KİŞİLERİNİ HAZIRLA
          Uyari.prototype.f_uyari_uyelerini_hazirla = function () {
              l.info("f_uyari_uyelerini_hazirla");
              var defer = result.dbQ.Q.defer(),
                  alert = this.alert;
  
              //uyarı gönderilecek kişileri bul
              if (alert.Uye_Idler && alert.Uye_Idler.length > 0) {
  
                  alert.RENDER.Uyeler.id_listesi.push(alert.Uye_Idler);
  
                  var db_kullanici = require('./db_kullanici');
                  db_kullanici.f_db_uye_id(alert.Uye_Idler, alert.Tahta_Id)
                      .then(function (_uyeler) {
                          if (_uyeler && _uyeler.length > 0) {
                              //üye bilgilerini topla
  
                              alert.RENDER.Uyeler.uye_listesi = _uyeler;
                              alert.RENDER.Uyeler.mail_listesi = _uyeler.pluckX("EPosta");
                              alert.RENDER.Uyeler.gsm_listesi = _uyeler.pluckX("GSM");
  
                              console.log("alert.RENDER.Uyeler>" + JSON.stringify(alert.RENDER.Uyeler));
                              defer.resolve(alert.RENDER.Uyeler);
  
                          } else {
                              defer.resolve(null);
                          }
  
                          /*   var arrPromises = _uyeler.map(function (_uye) {
                           if (_uye) {
  
                           alert.RENDER.Uyeler.uye_listesi.push(_uye);
  
                           if (_uye.EPosta) {
                           alert.RENDER.Uyeler.mail_listesi.push(_uye.EPosta);
                           }
  
                           if (_uye.GSM) {
                           alert.RENDER.Uyeler.gsm_listesi.push(_uye.GSM);
                           }
                           }
                           return _uye;
                           });
  
                           result.dbQ.Q.all(arrPromises)
                           .then(function () {
                           console.log("alert.RENDER.Uyeler>" + JSON.stringify(alert.RENDER.Uyeler));
                           defer.resolve(alert.RENDER.Uyeler);
                           });*/
                      });
  
              } else {
                  console.log("alert.RENDER.Uyeler>" + JSON.stringify(alert.RENDER.Uyeler));
                  defer.resolve(alert.RENDER.Uyeler);
              }
  
              return defer.promise;
          };
          Uyari.prototype.f_uyari_rollerini_hazirla = function () {
              l.info("f_uyari_rollerini_hazirla");
              var defer = result.dbQ.Q.defer(),
                  alert = this.alert;
              /*
               * Uyarı gönderilecek rol tanımlanmışsa
               * O role sahip üyeleri çekmeli ardından bulunan üyelere mail,sms..vb göndermeliyiz
               * */
              if (alert.Rol_Idler && alert.Rol_Idler.length > 0) {
  
                  f_role_bagli_uyeler(alert.Tahta_Id, alert.Rol_Idler, alert)
                      .then(function () {
                          console.log("alert.RENDER.Uyeler>" + JSON.stringify(alert.RENDER.Uyeler));
                          defer.resolve(alert.RENDER.Uyeler);
                      });
  
              } else {
                  //defer.reject({id: 0, mesaj: "roller dizisi gelmedi"});
                  console.log("alert.RENDER.Uyeler>" + JSON.stringify(alert.RENDER.Uyeler));
                  defer.resolve(alert.RENDER.Uyeler);
              }
  
              return defer.promise;
          };
          Uyari.prototype.f_uyari_kisilerini_hazirla = function () {
              l.info("f_uyari_kisilerini_hazirla");
              var defer = result.dbQ.Q.defer(),
                  alert = this.alert;
  
              if (alert.RENDER.ElasticQuery != null) {
                  //uyarı gönderilecek kişileri bul
  
                  var self = this;
                  result.dbQ.Q.all([
                      self.f_uyari_uyelerini_hazirla(),
                      self.f_uyari_rollerini_hazirla()
                  ]).then(function () {
                      defer.resolve(alert.RENDER.Uyeler);
                  });
  
              } else {
                  var hata = {id: 0, alert: alert, mesaj: "Elastic sorgusu oluşturulamadı!"};
                  alert.RENDER.Hata.push(hata);
              }
  
              return defer.promise;
          };
          //endregion
  
          //region UYARI İŞLEMLERİNİ TETİKLE
          Uyari.prototype.f_uyari_yapilacak_islemleri_tetikle = function () {
              l.info("f_uyari_yapilacak_islemleri_tetikle");
  
              var defer = result.dbQ.Q.defer(),
                  alert = this.alert;
  
              l.info("alert.RENDER.Sonuc>" + JSON.stringify(alert.RENDER.Sonuc));
  
              if (alert.RENDER.Sonuc.Toplam > 0) {
                  //hangi işlemler tanımlandı ise kişilere uygulayacağız
  
                  var arrPromiseIslemler = alert.Islemler.map(function (_islem) {
                      if (_islem == schema.SABIT.UYARI.MAIL) {
                          //mail seçilmiş tüm kişilere mail at
                          if (alert.RENDER.Uyeler.mail_listesi.length > 0) {
                              return f_mail_secildi(alert);
                          } else {
                              alert.RENDER.Hata.push({id: 0, alert: alert, mesaj: "Uyarı gönderilecek üye bilgisi olmadığı için mail gönderilemedi!"});
                          }
                      }
                      else if (_islem == schema.SABIT.UYARI.SMS) {
                          //sms gönderilmesi istenmiş
                          //_kullanicilar.gsm_listesi;
                          return null;
                      }
                      else if (_islem == schema.SABIT.UYARI.ALERT) {
                          //kullanıcı giriş yaptığında haberlerinde göstereceğiz
  
                          if (alert.RENDER.Uyeler.id_listesi.length > 0) {
                              return f_alert_secildi(alert);
                          } else {
                              alert.RENDER.Hata.push({id: 0, alert: alert, mesaj: "Uyarı gönderilecek üye bilgisi olmadığı için alert eklenemedi!"});
                          }
                      }
                      else if (_islem == schema.SABIT.UYARI.TODO) {
                          //kullanıcının yapılacaklar (to-do) listesine iş düşür
                          if (alert.RENDER.Uyeler.id_listesi.length > 0) {
                              return f_todo_secildi(alert);
                          } else {
                              alert.RENDER.Hata.push({id: 0, alert: alert, mesaj: "Uyarı gönderilecek üye bilgisi olmadığı için GÖREV eklenemedi!"});
                          }
                      }
                  });
                  result.dbQ.Q.all(arrPromiseIslemler)
                      .then(function () {
                          console.log("uyarılar gönderildi");
                          defer.resolve("uyarılar gönderildi");
                      })
                      .fail(function (_err) {
                          console.log("uyarılar gönderilemedi.HATA>" + _err);
                          defer.reject({id: 0, mesaj: "Uyarılar gönderilemedi! HATA: " + _err});
                      });
              } else {
                  var hata = {id: 0, alert: alert, mesaj: "Elastic sonucunda kritere uygun kayıt bulunamadı!"};
                  alert.RENDER.Hata.push(hata);
                  defer.reject({id: 0, mesaj: "Elastic sonucunda kritere uygun kayıt bulunamadı!"});
              }
  
              return defer.promise;
          };
          //endregion
  
          //region GOOGLE TAKVİME EKLE
          Uyari.prototype.f_uyariyi_google_takvime_ekle = function () {
              l.info("f_google_takvime_ekle");
              var defer = result.dbQ.Q.defer(),
                  alert = this.alert;
  
  
              //gelen uyarı to-do (görev) şeklinde tanımlandı ise ve tipi ihale ise
              //ihale bilgilerine göre google takvime ekliyoruz
              var todo = alert.Islemler.filter(function (_elm) {
                  return _elm == schema.SABIT.UYARI.TODO;
              });
  
              if (todo && todo.length > 0) {
                  if (alert.RENDER.Tipi.indexOf(schema.SABIT.TABLO_ADI.IHALE) != -1) {
                      //bu kayıtlı uyarı ihale işlemi
                      //google calendar a eklemeye başla
                      l.info("******google calendar a eklemeye başla************");
  
                      /** @type {OptionsTahta} */
                      var opt = {};
                      opt.bAnahtarlari = false;
                      opt.bGenel = true;
                      opt.bKurumu = false;
                      opt.bRolleri = false;
                      opt.bUyeleri = false;
                      opt.bAjanda = true;
  
                      var db_tahta = require('./db_tahta');
  
                      db_tahta.f_db_tahta_id(alert.Tahta_Id, opt)
                          .then(function (_dbTahta) {
                              l.info("******tahtanın google ajandası************" + JSON.stringify(_dbTahta.Ajanda.GC));
                              if (_dbTahta.Ajanda.GC && _dbTahta.Ajanda.GC.Id) {
                                  l.info("******tahtanın google ajandası seçilmiş************");
                                  alert.RENDER.Uyeler.uye_listesi.forEach(function (_elm) {
                                      if (_elm.Providers.GP && _elm.Providers.GP.token) {
                                          l.info("******kullanıcının token ı var************" + _elm.Providers.GP.token);
                                          f_google_takvime_ekle(_elm, _dbTahta, _elm)
                                              .then(function (_res) {
                                                  defer.resolve(_res);
                                              });
                                      }
                                      defer.resolve(null);
                                  });
                              }
                              defer.resolve(null);
                          });
                  }
                  else {
                      defer.resolve(null);
                  }
              }
              else {
                  defer.resolve(null);
              }
  
              return defer.promise;
          };
          //endregion
  
          //region KUYRUKTAN SİL
          Uyari.prototype.f_kuyruktan_sil = function () {
              l.info("f_kuyruktan_sil");
              var defer = result.dbQ.Q.defer(),
                  alert = this.alert;
              defer.resolve("başarılı");
              return defer.promise;
          };
          //endregion
  
          Uyari.prototype.f_calis = function () {
              var self = this;
  
              return self.f_ES_hazirla()
                  .then(function () {
                      return self.f_ES_query();
                  })
                  .then(function () {
                      return self.f_uyari_kisilerini_hazirla();
                  })
                  .then(function () {
                      return self.f_uyari_yapilacak_islemleri_tetikle();
                  })
                  .then(function () {
                      return self.f_uyariyi_google_takvime_ekle()
                  })
                  .then(function () {
                      return self.f_kuyruktan_sil();
                  })
                  .then(function () {
                      l.info("uyarı çalıştı");
                      return "uyarı çalıştı";
                  })
                  .fail(function (_err) {
                      if (_err.id != 100) {
                          // hata oluştu logla
                      }
                      l.e(self.alert.Olay + " için f_calis metodunda hata alındı: " + _err);
                      l.e(_err);
                  });
          };
  
          var uyari = new Uyari(_uyari);
          return uyari.f_calis();
      }