docs: 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);
              });
      }