Takip edilecek kalem setine ekle
@param _tahta_id
@param _kalem_id
@returns {*}
356805
function f_tahta_kalem_takip_ekle(_tahta_id, _kalem_id) {
        //kalem takip edilecek olarak belirlendiğinde ihalesi de takip edilecek olarak ayarlamalıyız
        return result.dbQ.sadd(result.kp.tahta.ssetTakiptekiKalemleri(_tahta_id), _kalem_id)
            .then(function () {
                return result.dbQ.hget(result.kp.kalem.hsetIhaleleri, _kalem_id)
                    .then(function (_ihale_id) {
                        return result.dbQ.sadd(result.kp.tahta.ssetTakiptekiIhaleleri(_tahta_id), _ihale_id);
                    });
            });
    }
959789
function f_tahta_anahtar_tumu(_tahta_id) {

        //tahtanın anahtar kelimelerini döner
        return result.dbQ.zrangebyscore([result.kp.tahta.zsetAnahtarKelimeleri(_tahta_id), '-inf', '+inf'])
            .then(function (_arr_anahtar_kelimeler) {
                if (_arr_anahtar_kelimeler && _arr_anahtar_kelimeler.length > 0) {

                    //önce anahtar kelimelere ait id leri tutuyoruz sonra da bilgilerini dönüyoruz
                    return result.f_db_anahtar_key(_arr_anahtar_kelimeler)
                        .then(function (_dbAnahtar_idler) {
                            return _arr_anahtar_kelimeler.map(function (_elm, _idx) {
                                /** @type {AnahtarKelime} */
                                return {Id: _dbAnahtar_idler[_idx], Anahtar: _elm};
                            }).allX();
                        });


                } else {
                    return [];
                }
            });
    }
946112
function f_tahta_ihale_indeksli_idler_tarihe_gore_sirali(_tahta_id) {
        console.log("f_db_tahta_ihale_indeksli_idler_tarihe_gore_sirali");
        return f_tahta_ihale_indeksli_idler(_tahta_id)
            .then(function () {
                return result.dbQ.exists(result.kp.temp.zsetTahtaAnahtaraGoreSiraliIhaleTarihineGore(_tahta_id))
                    .then(function (_iExist) {
                        return _iExist == 1
                            ? 1
                            : (result.dbQ.zinterstore(result.kp.temp.zsetTahtaAnahtaraGoreSiraliIhaleTarihineGore(_tahta_id), 2,
                            result.kp.temp.ssetTahtaAnahtarIhaleleri(_tahta_id),
                            result.kp.ihale.zsetYapilmaTarihi));
                    });
            });
    }
1028497
function f_tahta_ihale_takip_sil(_tahta_id, _ihale_id) {
        return result.dbQ.srem(result.kp.tahta.ssetTakiptekiIhaleleri(_tahta_id), _ihale_id);
    }
619746
function f_tahta_ihale_takip_tumu(_tahta_id) {
        return f_tahta_ihale_takip_idler(_tahta_id)
            .then(function (_ihale_idler) {
                if (_ihale_idler && _ihale_idler.length > 0) {
                    /** @type {OptionsIhale} */
                    var opts = {};
                    opts.bArrKalemleri = true;
                    opts.bYapanKurum = true;
                    opts.bTakip = true;

                    var db_ihale = require("./db_ihale");

                    return db_ihale.f_db_ihale_id(_ihale_idler, _tahta_id, opts);
                } else {
                    return [];
                }
            });
    }
1277996
function f_kalem_id(kalem_id, _tahta_id, _opts) {
        var optsKalem = result.OptionsKalem(_opts);

        return (Array.isArray(kalem_id)
            ? result.dbQ.hmget_json_parse(result.kp.kalem.tablo, kalem_id)
            : result.dbQ.hget_json_parse(result.kp.kalem.tablo, kalem_id))
            .then(
                /**
                 *
                 * @param {DBKalem|DBKalem[]} _dbKalem
                 */
                function (_dbKalem) {
                    if (!_dbKalem) {
                        return null;
                    }

                    /**
                     *
                     * @param {KalemDB} _kalem
                     * @param {OptionsKalem} _optKalemBilgileri
                     * @returns {*}
                     */
                    function f_KalemBilgileriniCek(_kalem, _optKalemBilgileri) {

                        if (!_kalem) {
                            return null;
                        }

                        // > Birden fazla kalem_id için tek bir sorguyla  ne çekebiliriz?
                        // - Kalemlerin durum onayını tek bir sorguyla tümü için çekebiliriz.
                        // > Tek tek çekilmesi gereken kalem bilgileri nelerdir?
                        // - Takiptemi, teklifleri
                        // saf olarak gelen kalem bilgisini OnayDurumu, Takip ve Teklifler alanlarıyla genişleterek döneceğiz

                        var olusan_kalem = schema.f_create_default_object(schema.SCHEMA.KALEM);

                        olusan_kalem = _.extend(olusan_kalem, _kalem);

                        return result.dbQ.Q.all([
                                (_optKalemBilgileri.bOnayDurumu && _tahta_id
                                    ? f_kalem_onay_durumu(_kalem.Id, _tahta_id)
                                    : {Id: 0}),
                                (_optKalemBilgileri.bTakiptemi && _tahta_id
                                    ? result.dbQ.sismember(result.kp.tahta.ssetTakiptekiKalemleri(_tahta_id), _kalem.Id)
                                    : 0),
                                (_optKalemBilgileri.bArrTeklifleri
                                    ? f_kalem_teklif_tumu(_tahta_id, _kalem.Id)
                                    : [])
                            ])
                            .then(function (_ress) {
                                olusan_kalem.OnayDurumu = _ress[0];
                                olusan_kalem.Takip = _ress[1];
                                olusan_kalem.Teklifler = _ress[2];
                                return olusan_kalem;
                            });
                    };


                    if (Array.isArray(_dbKalem)) {// Onay durumlarını yekten çek, diğer bilgilerini her kalem için tek tek çek
                        optsKalem.bOnayDurumu = false;
                        return _dbKalem
                            .mapX(null, f_KalemBilgileriniCek, optsKalem)
                            .allX()
                            .then(function (dbKalemBilgilerle) {

                                return f_kalem_onay_durumu(kalem_id, _tahta_id)
                                    .then(function (dbKalemOnayDurumlari) {

                                        return dbKalemBilgilerle.map(function (_elm, _idx) {
                                            _elm.OnayDurumu = dbKalemOnayDurumlari[_idx];
                                            return _elm;
                                        });

                                    });
                            })
                            .fail(function (_err) {
                                throw new exception.Istisna("Kalem bilgisi çekilemedi", _err);
                            });
                    } else {
                        return f_KalemBilgileriniCek(_dbKalem, optsKalem);
                    }
                })
            .fail(function (_err) {
                console.log("DB ERROR oldu: ", _err);
                throw new exception.Istisna("Kalem bilgisi çekilemedi", "f_db_kalem_id içinde: " + _err);
            });
    }
613438
function f_tahtanin_gizlenen_kalemleri(_ihale_id, _tahta_id) {
        f_tahtanin_gizlenen_kalem_idleri(_ihale_id, _tahta_id)
            .then(function (_kalem_idler) {
                var db_kalem = require("./db_kalem");
                /** @type {OptionsKalem} */
                var opt = {};
                opt.bArrTeklifleri = false;
                opt.bOnayDurumu = true;
                opt.bTakiptemi = true;
                return db_kalem.f_db_kalem_id(_kalem_idler, _tahta_id, opt);
            });
    }
1269712
function f_teklif_urunleri(_teklif_id, _tahta_id, _opts) {

        return f_teklif_urun_idleri(_teklif_id)
            .then(function (_dbUrun_idler) {
                if (_dbUrun_idler && _dbUrun_idler.length > 0) {
                    console.log("_dbUrun_idler>" + _dbUrun_idler);

                    var db_urun = require("./db_urun");
                    return db_urun.f_db_urun_id(_dbUrun_idler, _tahta_id, _opts)

                } else {
                    return []
                }
            });
    }
1195836
function f_indekslenen_ve_takip_edilen_ihale_idleri(_tahta_id) {
        return result.dbQ.Q.all([
            f_tahta_ihale_indeksli_idler(_tahta_id),
            f_tahta_ihale_takip_idler(_tahta_id)
        ]).then(function (_ress) {
            console.log("indekslenen_ve_takip_edilen_ihale_idleri SONUCU:");
            console.log(JSON.stringify(_ress));
            var indexliler = _ress[0],
                takiptekiler = _ress[1];

            return _.union(indexliler, takiptekiler);
        })
    }
809676
function f_tahtanin_takipteki_ihale_idleri(_tahta_id) {

        return result.dbQ.smembers(result.kp.tahta.ssetTakiptekiIhaleleri(_tahta_id))
            .then(function (_takipteki_ihale_idler) {

                //herhangibir kayıt yoksa boş dizi dönüyoruz
                if (!_takipteki_ihale_idler || _takipteki_ihale_idler.length == 0) {
                    return [];
                }

                return f_tahta_ihale_idler_aktif(_tahta_id)
                    .then(function (_aktif_ihale_idler) {
                        return _.intersection(_aktif_ihale_idler, _takipteki_ihale_idler);
                    });
            });
    }
1057925
function f_rol_tumu(_tahta_id) {
        return result.dbQ.smembers(result.kp.tahta.ssetOzelTahtaRolleri(_tahta_id, true))
            .then(function (_rol_idler) {
                return f_rol_id(_rol_idler);
            });
    }
34923
function f_rol_sil_tahta(_tahta_id, _rol_id, _arrKul_id) {

        // 1. Tahtanın üye id lerini Array mi diye kontrol et
        // 2. üye id lerinden rolü çıkar
        // 3. tahta id den bu rolü sil
        if (_rol_id) {
            var arrPromises = Array.isArray(_arrKul_id) //1
                ? _arrKul_id.mapX(null, f_rol_sil_kullanici, _tahta_id, _rol_id) // 2
                : [];
            //3

            return arrPromises.concat(_arrKul_id).allX()
                .then(function () {
                    return [
                        result.dbQ.srem(result.kp.tahta.ssetOzelTahtaRolleri(_tahta_id, true), _rol_id),
                        result.dbQ.sadd(result.kp.tahta.ssetOzelTahtaRolleri(_tahta_id, false), _rol_id)
                    ].allX();
                });
        } else {
            console.error("Silinecek aktif bir rol bulunamadı");
            throw "Silinecek aktif bir rol bulunamadı";
        }
    }
1243047
function f_aktif_kurum_idleri(_tahta_id, _sayfalama) {
        var defer = result.dbQ.Q.defer();

        var multi = result.rc.multi(),
            sonucAnahtari = _tahta_id && _tahta_id > 0
                ? result.kp.temp.ssetTahtaKurum(_tahta_id)
                : result.kp.temp.ssetKurum;


        result.dbQ.exists(sonucAnahtari)
            .then(function (_iExist) {

                if (_iExist) {
                    //temp anahtarı var yeniden çekmeye gerek yok, kurum bilgilerini dön
                } else {
                    //temp anahtarı yok oluştur ve kurum bilgilerini dön

                    //temp:kurum:genel:aktif = kurum:genel - kurum:X
                    multi.sdiffstore(result.kp.temp.ssetKurum, result.kp.kurum.ssetGenel, result.kp.kurum.ssetSilinen);

                    if (_tahta_id && _tahta_id > 0) {
                        multi.sunionstore(result.kp.temp.ssetTahtaKurumTumu(_tahta_id), result.kp.temp.ssetKurum, result.kp.tahta.ssetOzelKurumlari(_tahta_id, true))
                            .sunionstore(result.kp.temp.ssetTahtaKurumIstenmeyen(_tahta_id), result.kp.tahta.ssetOzelKurumlari(_tahta_id, false), result.kp.tahta.ssetGizlenenKurumlari(_tahta_id), result.kp.tahta.ssetEzilenKurumlari(_tahta_id))
                            .sdiffstore(result.kp.temp.ssetTahtaKurum(_tahta_id), result.kp.temp.ssetTahtaKurumTumu(_tahta_id), result.kp.temp.ssetTahtaKurumIstenmeyen(_tahta_id));
                    }
                }

                multi.exec(function (err, replies) {
                    if (err) {
                        l.e("Kurumlar çekilemedi. MULTI ERROR: " + err);
                        defer.reject(err);
                    }

                    if (_sayfalama) {
                        var baslangic = _sayfalama.Sayfa * _sayfalama.SatirSayisi,
                            bitis = _sayfalama.SatirSayisi;
                    }

                    (_sayfalama
                        ? result.dbQ.sort(sonucAnahtari, "LIMIT", baslangic, bitis)
                        : result.dbQ.smembers(sonucAnahtari))
                        .then(function (_dbReply) {
                            defer.resolve(_dbReply);
                        }).fail(function (_err) {
                        l.e("Kurumlar çekilemedi. Hata: " + _err);
                        defer.reject(_err);
                    });
                });
            });


        return defer.promise;
    }
883426
function f_kalem_guncelle(_tahta_id, _ihale_id, _es_kalem, _db_kalem, _kul_id) {

        // region NOTLAR
        /*
         HASH LOGLAR
         * ID
         * LOG:SATIR:1 x
         * SATIR:1 xx
         * SATIR:1 xxx
         *
         *
         *
         * HASH kalem
         * -- Ekleniyor --
         * incr idx:kalem                                                        -> id olarak 1 versin
         * hset kalem | 1 | {.....}                                              -> hset ile HASH içine ekle
         * zadd ihale:1:satirlari:eklenen | 143123123 | 1                        -> eklendiği tarihle EKLENENLERE yaz ki aktif SATIRLAR bulunabilsin
         * sadd LOG:kalem:1 | {kullanici:132, tarih:143123123, nesne:{.....} }   -> log oluştur
         * -- Güncelleme geldi --
         * hset kalem | 1 | {.....}
         * sadd LOG:kalem:1 | {.....}
         * -- Silinecek --
         * zadd ihale:1:satirlari:silinen | 143126663 | 1
         * sadd LOG:kalem:1 | {.....}
         *
         * SET LOG:SATIR:1
         * {kullanici:12, tarih:23423423, metin:'ihale eklendi' nesne:obje}
         * obje2
         * obje3
         *
         * ZSET LOG:SATIR:1
         * tarih   obje
         * tarih1  obje2
         * tarih2  obje3
         *
         *
         * kullanici:1:haberleri:eklenen
         * {tarih:23423423, metin:'Yeni ihale eklendi' nesne:null, referans_id:'ihale:19'} > <a href="#ihale/19">Yeni ihale eklendi</a>
         * {tarih:23423423, metin:'{this.nesne.konusu} başlıklı ihale eklendi' nesne:{id:19, konusu:....}, referans_id:'ihale:19'} > <a href="#ihale/19">Yeni ihale eklendi</a>
         * **/
        // endregion

        var onay_durumu = _es_kalem.OnayDurumu,
            orjinal_kalem_id = _db_kalem.Id;

        /**
         * Genel kalem ise yeni kalem eklenir
         * @returns {*}
         */
        function f_genel_kalem_guncelle() {
            return result.dbQ.incr(result.kp.kalem.idx)
                .then(function (_id) {
                    _es_kalem.Id = _db_kalem.Id = _id;
                    _db_kalem.Orjinal_Id = _es_kalem.Orjinal_Id = orjinal_kalem_id;

                    emitter.emit(schema.SABIT.OLAY.KALEM_GUNCELLENDI,
                        {
                            tahta_id: _tahta_id,
                            yeni_kalem: _es_kalem,
                            orjinal_kalem_id: orjinal_kalem_id,
                            ihale_id: _ihale_id,
                            kul_id: _kul_id
                        });

                    return result.dbQ.hset(result.kp.kalem.tablo, _db_kalem.Id, JSON.stringify(_db_kalem))
                        .then(function () {

                            //onay durumları ile ilgili işlemleri tamamlayacağız
                            //satırın onay durumunu eski listeden kaldırıp yenisine ekliyoruz
                            //örneğin katılıyoruz (2) demişti sadd tahta:401:durum:2 201 setine eklemiştik
                            //sonra gitti itiraz edilecek (3) dedi bu durumda önce gidip katılıyoruz listesinden kaldırıyoruz
                            //srem tahta:401:durum:2 201
                            return f_kalem_onay_durumu(orjinal_kalem_id, _tahta_id)
                                .then(function (_dbDurum) {
                                    if (_dbDurum != null) {
                                        //eski satıra ait onay durum bilgileri vars siliyoruz
                                        return result.dbQ.Q.all([
                                            result.dbQ.srem(result.kp.kalem.ssetOnayDurumlari(_tahta_id, _dbDurum.Id), orjinal_kalem_id),
                                            result.dbQ.hdel(result.kp.tahta.hsetKalemOnayDurumlari(_tahta_id), orjinal_kalem_id)
                                        ]);
                                    }
                                    else {
                                        return _db_kalem;
                                    }
                                });
                        })
                        .then(function () {
                            //genel kalemi tahtanın ezilen kalemlerine ekliyoruz
                            //tahtanın özel kalemlerine ekliyoruz
                            //kalem onay durumları setine ekliyoruz
                            return result.dbQ.Q.all([
                                result.dbQ.sadd(result.kp.tahta.ssetEzilenKalemleri(_tahta_id), orjinal_kalem_id),
                                result.dbQ.sadd(result.kp.tahta.ssetOzelKalemleri(_tahta_id, _ihale_id, true), _id)
                            ]);
                        })
                        .then(function () {
                            //satırın onay durumlarını düzenle
                            return f_kalem_onay_durumu_guncelle(_tahta_id, _ihale_id, _db_kalem.Id, onay_durumu);
                        })
                        .then(function () {
                            //satıra verilen teklifler ile tahtada verilen tekliflerin kesişimini bulup
                            //gelen kayıtları yeni satır id ile ilişkilendiriyoruz
                            return result.dbQ.sinter(result.kp.kalem.ssetTeklifleri(orjinal_kalem_id), result.kp.tahta.ssetTeklifleri(_tahta_id, true))
                                .then(function (_iTeklif_idler) {
                                    if (_iTeklif_idler && _iTeklif_idler.length > 0) {

                                        var arrPromises = _.map(_iTeklif_idler, function (_teklif_id) {
                                            return result.dbQ.Q.all([
                                                result.dbQ.sadd(result.kp.kalem.ssetTeklifleri(_db_kalem.Id), _teklif_id),
                                                result.dbQ.srem(result.kp.kalem.ssetTeklifleri(orjinal_kalem_id), _teklif_id),
                                                result.dbQ.hset(result.kp.teklif.hsetKalemleri, _teklif_id, _db_kalem.Id)
                                            ]);
                                        });

                                        return result.dbQ.Q.all(arrPromises);
                                    }
                                    return _db_kalem.Id;
                                });
                        })
                        .then(function () {
                            return f_kalem_id(_db_kalem.Id, _tahta_id);
                        });
                });
        }

        /**
         * Tahtaya ait özel kalem güncellenir.
         * @returns {*}
         */
        function f_ozel_kalem_guncelle() {
            emitter.emit(schema.SABIT.OLAY.KALEM_GUNCELLENDI,
                {
                    tahta_id: _tahta_id,
                    yeni_kalem: _es_kalem,
                    orjinal_kalem_id: orjinal_kalem_id,
                    ihale_id: _ihale_id,
                    kul_id: _kul_id
                });

            //özel kalem bilgisinde hash sadece güncellenir
            return result.dbQ.hset(result.kp.kalem.tablo, _db_kalem.Id, JSON.stringify(_db_kalem))
                .then(function () {
                    //onay durumları ile ilgili işlemleri tamamlayacağız
                    //satırın onay durumunu eski listeden kaldırıp yenisine ekliyoruz
                    //örneğin katılıyoruz (2) demişti sadd tahta:401:durum:2 201 setine eklemiştik
                    //sonra gitti itiraz edilecek (3) dedi bu durumda önce gidip katılıyoruz listesinden kaldırıyoruz
                    //srem tahta:401:durum:2 201
                    //onay durumu varsa güncelle yoksa satırı döner
                    return f_kalem_onay_durumu_guncelle(_tahta_id, _ihale_id, _db_kalem.Id, onay_durumu)
                        .then(function () {
                            return f_kalem_id(_db_kalem.Id, _tahta_id);
                        });
                });
        }

        return f_kalem_genel_kontrol(orjinal_kalem_id)
            .then(function (_iGenel) {
                if (_iGenel == 1) {
                    //genel kalem ezilir
                    return f_genel_kalem_guncelle();

                } else {
                    return f_ozel_kalem_guncelle()
                }
            });
    }
1213029
function f_kalem_teklif_idleri(_tahta_id, _kalem_id, _sayfalama) {
        var defer = result.dbQ.Q.defer();

        var multi = result.rc.multi(),
            sonucAnahtari = result.kp.temp.ssetTahtaKalemTeklifleri(_tahta_id, _kalem_id);

        result.dbQ.exists(sonucAnahtari)
            .then(function (_iExist) {

                if (_iExist) {
                    //temp anahtarı var yeniden çekmeye gerek yok, teklif bilgilerini dön
                } else {
                    //temp anahtarı yok oluştur ve teklif bilgilerini dön
                    multi.sinterstore(sonucAnahtari, result.kp.kalem.ssetTeklifleri(_kalem_id), result.kp.tahta.ssetTeklifleri(_tahta_id, true));
                }

                multi.exec(function (err, replies) {
                    if (err) {
                        l.e("Teklifler çekilemedi. MULTI ERROR: " + err);
                        defer.reject(err);
                    }

                    if (_sayfalama) {
                        var baslangic = _sayfalama.Sayfa * _sayfalama.SatirSayisi,
                            bitis = _sayfalama.SatirSayisi;
                    }

                    (_sayfalama
                        ? result.dbQ.sort(sonucAnahtari, "LIMIT", baslangic, bitis)
                        : result.dbQ.smembers(sonucAnahtari))
                        .then(function (_dbReply) {
                            defer.resolve(_dbReply);
                        })
                        .fail(function (_err) {
                            l.e("Kalem teklifleri çekilemedi. Hata: " + _err);
                            defer.reject(_err);
                        });
                });
            });

        return defer.promise;
    }
219938
function f_uyarilar_tahta_tumu(_tahta_id) {
        return result.dbQ.smembers(result.kp.tahta.ssetUyarilari(_tahta_id, true))
            .then(function (_uyari_idleri) {
                return f_uyari_id(_uyari_idleri, _tahta_id);
            });
    }
640437
function (_ihale_id, _kalem, _tahta_id) {
        console.log("f_db_kalem_index");

        function f_indexle(_tahta_id, _ihale_id, _kalem) {
            console.log(_kalem);

            return db.tahta.f_db_tahta_anahtar_tumu(_tahta_id)
                .then(
                    /**
                     *
                     * @param {AnahtarKelime[]} _arrKelimeler
                     * @returns {*}
                     */
                    function (_arrKelimeler) {
                        if (_arrKelimeler && _arrKelimeler.length > 0) {

                            _.some(_arrKelimeler, function (_elm) {
                                var anahtar = _elm.Anahtar.turkishToLower();
                                if ((_kalem.Aciklama && _kalem.Aciklama.turkishToLower().indexOf(anahtar) > -1) ||
                                    (_kalem.BransKodu && _kalem.BransKodu.turkishToLower().indexOf(anahtar) > -1)) {

                                    console.log("bulunan");
                                    console.log("açıklama:" + _kalem.Aciklama);
                                    console.log("branş:" + _kalem.BransKodu);

                                    return db.redis.dbQ.Q.all([
                                        db.anahtar.f_db_anahtar_index_ekle_kalem(_elm.Id, _kalem.Id),
                                        db.anahtar.f_db_anahtar_index_ekle_ihale(_elm.Id, _ihale_id)
                                    ]);
                                }
                            });

                        } else {
                            return _kalem;
                        }
                    })
                .then(function () {
                    return _kalem;
                });
        }

        if (_tahta_id && _tahta_id > 0) {
            //tahtaya g�re index olu�tur
            f_indexle(_tahta_id, _ihale_id, _kalem);

        } else {

            //t�m tahtalar� �ek
            return db.tahta.f_db_tahta_tumu()
                .then(function (_arrTahtalar) {
                    console.log("tahtalar");

                    //her biri i�inde d�n�p �r�n�n/kurumun/tahtan�n/kullan�c�n�n anahtarlar�na ba�l� sat�rlar� varsa ihale_id yi yaz ve indexle
                    var arrPromises = _.map(_arrTahtalar, function (_dbTahta) {
                        console.log("tahtalar i�inde d�n�yoruz");

                        console.log(_kalem);
                        return f_indexle(_dbTahta.Id, _ihale_id, _kalem)
                            .then(function () {
                                return _kalem;
                            });
                    });

                    return db.redis.db.dbQ.Q.all(arrPromises);
                })
                .then(function (_arr) {
                    console.log(_arr);
                    return _arr;
                });
        }
    }