region ÜRÜN İŞLEMLERİ (EKLE-SİL-GÜNCELLE-BUL) 

@param {integer} _tahta_id
@param {integer} _sayfalama
@returns {LazyLoadingResponse|Promise}
11620
function f_urun_tumu(_tahta_id, _sayfalama) {
        //l.info("f_db_urun_tumu");

        return f_urun_aktif_urun_idleri(_tahta_id, _sayfalama)
            .then(
                /** @param {string[]} _aktifUrun_idleri */
                function (_aktifUrun_idleri) {
                    return result.dbQ.Q.all([
                            (_aktifUrun_idleri.length > 0
                                ? result.dbQ.scard(result.kp.temp.ssetTahtaUrun(_tahta_id))
                                : 0),
                            (_aktifUrun_idleri.length > 0
                                ? f_urun_id(_aktifUrun_idleri, _tahta_id)
                                : [])
                        ])
                        .then(function (_dbReplies) {
                            var sonuc = schema.f_create_default_object(schema.SCHEMA.LAZY_LOADING_RESPONSE);
                            sonuc.ToplamKayitSayisi = _dbReplies[0];
                            sonuc.Data = _dbReplies[1];
                            return sonuc;
                        })
                })
            .fail(function (_err) {
                l.e("sistemde kayıtlı ürünler çekilemedi." + _err);
                throw new exception.Istisna("Ürünler çekilemedi", "Sistemde kayıtlı ürünler çekilirken hata alındı: " + _err)
            });
    }
362792
function f_teklifleri(tahta_id, ihale_id) {
        var defer = result.dbQ.Q.defer();

        //ihaleye bağlı teklifleri bul
        result.rc.multi()
            .sinterstore("temp_ihale_teklif", result.kp.ihale.ssetTeklifleri(ihale_id), result.kp.tahta.ssetTeklifleri(tahta_id, true))
            .smembers("temp_ihale_teklif")
            .expire("temp_ihale_teklif", 10)
            .exec(function (err, replies) {
                l.info("MULTI REPLY" + JSON.stringify(replies));

                if (replies[1] && replies[1].length > 0) {
                    defer.resolve(replies[1]);

                } else {
                    defer.resolve(null);
                }
            });

        return defer.promise;
    }
963987
function f_takip_kontrol(_tahta_id, _ihaleler) {

        if (Array.isArray(_ihaleler) && _ihaleler.length > 0) {

            var arr = _ihaleler.map(function (_ihale) {
                return f_takipte_mi(_tahta_id, _ihale)
            });

            return result.dbQ.Q.all(arr);

        } else {
            return f_takipte_mi(_tahta_id, _ihaleler);
        }
    }
848265
function f_teklif_tumu(_tahta_id, _ihale_id, _arama) {

        return f_teklif_idleri(_tahta_id, _ihale_id, _arama.Sayfalama)
            .then(
                /**
                 *
                 * @param {string[]} _teklif_idler
                 * @returns {*}
                 */
                function (_teklif_idler) {

                    var sonucAnahtari = result.kp.temp.ssetTahtaIhaleTeklifleri(_tahta_id, _ihale_id),
                        /** @type {LazyLoadingResponse} */
                        sonuc = schema.f_create_default_object(schema.SCHEMA.LAZY_LOADING_RESPONSE);

                    if (_teklif_idler && _teklif_idler.length > 0) {
                        return result.dbQ.scard(sonucAnahtari)
                            .then(function (_toplamKayitSayisi) {
                                sonuc.ToplamKayitSayisi = parseInt(_toplamKayitSayisi);

                                var db_teklif = require('./db_teklif');
                                var opts = db_teklif.OptionsTeklif({
                                    bArrUrunler: true,
                                    bKalemBilgisi: true,
                                    bIhaleBilgisi: true,
                                    bKurumBilgisi: true,
                                    optUrun: {}
                                });

                                return db_teklif.f_db_teklif_id(_teklif_idler, _tahta_id, opts)
                                    .then(function (_dbTeklifler) {
                                        //göndermeden önce sıralıyoruz
                                        var teklifler = _.sortBy(_dbTeklifler, ['Kalem_Id', 'TeklifDurumu_Id']);
                                        sonuc.Data = teklifler;
                                        return sonuc;
                                    });
                            });
                    } else {
                        //teklif yok
                        sonuc.ToplamKayitSayisi = 0;
                        sonuc.Data = [];
                        return sonuc;
                    }
                });
    }
1118519
function f_bolge_sehir_ekle(_sehir_idler, _bolge_id, _tahta_id) {
        if (Array.isArray(_sehir_idler) && _sehir_idler.length > 0) {
            return _sehir_idler.mapX(null, function (_sehir_id) {
                return result.dbQ.sadd(result.kp.bolge.ssetSehirleri(_bolge_id), _sehir_id);
            }).allX();
        } else {
            return result.dbQ.sadd(result.kp.bolge.ssetSehirleri(_bolge_id), _sehir_idler);
        }
    }
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 [];
                }
            });
    }
421283
function f_tahta_guncelle(_tahta_db, _kul_id) {
        delete _tahta_db.Kurum;
        l.info("f_db_tahta_guncelle");
        return result.dbQ.hset(result.kp.tahta.tablo, _tahta_db.Id, JSON.stringify(_tahta_db))
            .then(function () {
                return f_tahta_id(_tahta_db.Id)
                    .then(function (_dbTahta) {
                        emitter.emit(schema.SABIT.OLAY.TAHTA_GUNCELLENDI, _dbTahta, _kul_id);
                        return _dbTahta;
                    });
            });
    }
31002
function f_tahta_ekle(_tahta_db, _kul_id) {

        if (!_kul_id) {
            throw new exception.Istisna("Kullanıcı bilgisi eksik", "Tahtayı ekleyen kullanıcı bilgisi bulunamadı!");
        }

        /**
         * Tahtanın ilk oluşturulmasında admin kullanıcısını(tahtanın sahibini) tüm rollerle ilişkilendiriyoruz
         * @param _tahta_id
         * @param _kul_id
         * @returns {*}
         */
        var tahta_kullanicilarini_rollerle_iliskilendir = function (_tahta_id, _kul_id) {
            l.info("f_kullaniciyi_rol_iliskilendir");
            // 3. Kullanıcıya rolü atayalım
            // 3.1 Kullanıcının rollerini çek
            // 3.2 Rollerine yeni rolü ekle
            return result.dbQ.Q.all([
                result.dbQ.smembers(result.kp.tahta.ssetOzelTahtaRolleri(_tahta_id, true)),
                result.dbQ.hget(result.kp.tahta.hsUyeleri(_tahta_id), _kul_id) // 3.1
            ]).then(function (_arrDbReplies) {
                var dbRol_idler = _arrDbReplies[1];
                // 3.2
                var roller = Array.isArray(dbRol_idler) ? dbRol_idler : [];

                //şemaya uygun hale getirmek için int yapılıyor
                var arr_tahta_rol_idler = _arrDbReplies[0].mapX(null, parseInt);

                var son = roller.concat(arr_tahta_rol_idler);
                return f_tahta_uye_rol_guncelle(_tahta_id, _kul_id, son)
            });
        };

        delete _tahta_db.Kurum;

        //l.i("f_db_tahta_ekle > _tahta: " + JSON.stringify(_tahta_db));

        // 1. Tahta oluştur
        // 1.1 incr idx
        // 2. Tahta için temel rolleri oluştur ve tahtayla ilişkilendir
        // 3. Kullaniciyi tahtanın sahibi yap ve ilk rolleri(yonetici, gozlemci) rolünü ver
        // 4. Tahtanın ID sini kullanicinin sahip olduklarinin içine yaz
        // 5. bölgeleri ekle
        return result.dbQ.incr(result.kp.tahta.idx)
            .then(function (_id) {

                var rol = require('./db_rol');

                _tahta_db.Id = _id;
                // TODO: Tahta rollerini json'dan çekiyor ama bunu otomatik hale getirip json ilişkisi kaldırılacak.
                var arrTemelRoller = require("../lib/roller.json").data;

                return [
                    result.dbQ.hset(result.kp.tahta.tablo, _id, JSON.stringify(_tahta_db)), // 1
                    rol.f_db_rol_ekle(arrTemelRoller, _tahta_db.Id), // 2
                    result.dbQ.sadd(result.kp.kullanici.ssetSahipOlduguTahtalari(_kul_id, true), _id) // 4
                ].allX()
                    .then(function () {

                        l.info("kullanıcı rol ilşkilendir");
                        return tahta_kullanicilarini_rollerle_iliskilendir(_id, _kul_id); // 3

                    })
                    .then(function () {
                        l.info("HERŞEY BİTTİ TAHTA ID DEN DÖN");
                        return f_tahta_id(_id)//4
                            .then(function (_dbTahta) {
                                emitter.emit(schema.SABIT.OLAY.TAHTA_EKLENDI, _dbTahta, _kul_id);
                                return _dbTahta;
                            });
                    })
                    .fail(function (_err) {
                        l.e("f_db_tahta_ekle fail func> ERR: ", _err);
                        return _err;
                    });
            });
    }
1174549
function f_kalem_takip_idler(_tahta_id) {
        return result.dbQ.smembers(result.kp.tahta.ssetTakiptekiKalemleri(_tahta_id));
    }
31042
function f_kullanici_tahtalari(_kul_id, _opts) {

        return f_kullanici_tahta_idleri(_kul_id)
            .then(function (_dbArrTahtaId) {
                //console.log = "Oncesi _dbArrTahtaId": _dbArrTahtaId;
                var db_tahta = require('./db_tahta');
                return db_tahta.f_db_tahta_id(_dbArrTahtaId, _opts);
            });
    }
232597
function f_bolge_sehirleri(_id) {
        /** @type {LazyLoadingResponse} */
        var sonuc = schema.f_create_default_object(schema.SCHEMA.LAZY_LOADING_RESPONSE);

        return result.dbQ.smembers(result.kp.bolge.ssetSehirleri(_id))
            .then(/**
             *
             * @param {string[]} _sehir_idler
             * @returns {*}
             */
            function (_sehir_idler) {
                if (_sehir_idler && _sehir_idler.length > 0) {
                    var db_sehir = require("./db_sehir");
                    return db_sehir.f_db_sehir_id(_sehir_idler)
                        .then(function (_sehirler) {
                            sonuc.ToplamKayitSayisi = parseInt(_sehirler.length);
                            sonuc.Data = _sehirler;
                            return sonuc;
                        })

                } else {
                    sonuc.ToplamKayitSayisi = 0;
                    sonuc.Data = [];
                    return sonuc;
                }
            })
            .fail(function () {
                l.e("bölge şehirleri çekilemedi");
            });
    }
1064255
function f_rol_ekle(_rol, _tahta_id) {

        return result.dbQ.incr(result.kp.rol.idx)
            .then(function (_id) {
                _rol.Id = _id;
                // 1. Rollere ekleyelim
                // 2. Tahtayla ilişkilendirelim
                return result.dbQ.Q.all([
                    result.dbQ.hset(result.kp.rol.tablo, _id, JSON.stringify(_rol)),// 1
                    result.dbQ.sadd(result.kp.tahta.ssetOzelTahtaRolleri(_tahta_id, true), _rol.Id) // 2
                ]).then(function () {
                    return f_ol_id(_rol.Id);
                });
            });
    }
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;
    }
1294051
function f_temp_sil_tahta(_tahta_id) {
    return db.redis.dbQ.del(db.redis.kp.temp.ssetTahtaKullanici(_tahta_id));
}
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);
            });
    }
1021594
function f_aktif_kalem_idler(_ihale_id, _tahta_id) {
        var defer = result.dbQ.Q.defer();

        result.dbQ.Q.all([
                result.dbQ.sunion(result.kp.ihale.ssetKalemleri(_ihale_id), result.kp.tahta.ssetOzelKalemleri(_tahta_id, _ihale_id, true)),
                result.dbQ.sunion(result.kp.tahta.ssetOzelKalemleri(_tahta_id, _ihale_id, false), result.kp.tahta.ssetEzilenKalemleri(_tahta_id), result.kp.tahta.ssetGizlenenKalemleri(_tahta_id))
            ])
            .then(function (_arrDbReplies) {
                var aktifler = _arrDbReplies[0],
                    pasifler = _arrDbReplies[1];
                defer.resolve(aktifler.differenceXU(pasifler));

            })
            .fail(function (_err) {
                l.e("Kalemler çekilirken hata oldu: " + _err);
                defer.reject(_err)
            });
        return defer.promise;
    }
127099
function f_tahta_davet(_tahta_id, _davetId) {
        return result.dbQ.hget_json_parse(result.kp.tahta.hsDavetler(_tahta_id), _davetId);
    }