nodebb-plugin-niki-loyalty 1.5.9 → 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +1,10 @@
1
1
  {
2
2
  "permissions": {
3
3
  "allow": [
4
- "Bash(node:*)"
4
+ "Bash(node:*)",
5
+ "WebSearch",
6
+ "WebFetch(domain:www.kentkart.com)",
7
+ "WebFetch(domain:odepos.com)"
5
8
  ]
6
9
  }
7
10
  }
package/library.js CHANGED
@@ -10,8 +10,14 @@ const SocketPlugins = require.main.require('./src/socket.io/plugins');
10
10
  const groups = require.main.require('./src/groups');
11
11
  const Plugin = {};
12
12
 
13
- // Ödül kullanabilecek gruplar
14
- const WALLET_GROUPS = ['Premium', 'Lite', 'VIP'];
13
+ // Grup bazlı kazanım çarpanları (en yüksek üyelik kazanır).
14
+ // Bu gruplara üye olmayan kullanıcılar DEFAULT_EARN_RATE alır.
15
+ const EARN_RATES = {
16
+ VIP: 1.5,
17
+ Premium: 1.25,
18
+ Lite: 1.0,
19
+ };
20
+ const DEFAULT_EARN_RATE = 0.5;
15
21
 
16
22
  // =========================
17
23
  // ⚙️ AYARLAR & KURALLAR (GAME LOGIC)
@@ -136,6 +142,24 @@ async function addKasaLog(staffUid, customerName, customerUid, rewardName, amoun
136
142
  await db.listTrim('niki:kasa:history', -100, -1);
137
143
  }
138
144
 
145
+ // Kademeli çarpan: VIP 1.5x, Premium 1.25x, Lite 1.0x, üyelik yok 0.5x.
146
+ // Birden fazla gruba üyeyse en yüksek çarpan uygulanır.
147
+ async function getEarnMultiplier(uid) {
148
+ try {
149
+ const groupNames = Object.keys(EARN_RATES);
150
+ const memberChecks = await Promise.all(groupNames.map(g => groups.isMember(uid, g)));
151
+ let maxRate = DEFAULT_EARN_RATE;
152
+ groupNames.forEach((g, i) => {
153
+ if (memberChecks[i] && EARN_RATES[g] > maxRate) {
154
+ maxRate = EARN_RATES[g];
155
+ }
156
+ });
157
+ return maxRate;
158
+ } catch (err) {
159
+ return DEFAULT_EARN_RATE;
160
+ }
161
+ }
162
+
139
163
  // 🔥 MERKEZİ PUAN DAĞITIM FONKSİYONU 🔥
140
164
  // Bütün puan işlemleri buradan geçer, limitleri kontrol eder.
141
165
  async function awardDailyAction(uid, actionKey) {
@@ -165,8 +189,9 @@ async function awardDailyAction(uid, actionKey) {
165
189
  return { success: false, reason: 'action_limit_reached' };
166
190
  }
167
191
 
168
- // 3. Puan Hesapla
169
- let pointsToGive = rule.points;
192
+ // 3. Puan Hesapla (premium-dışı kullanıcı için yarım puan)
193
+ const multiplier = await getEarnMultiplier(uid);
194
+ let pointsToGive = rule.points * multiplier;
170
195
  if (currentDailyScore + pointsToGive > SETTINGS.dailyCap) {
171
196
  pointsToGive = SETTINGS.dailyCap - currentDailyScore;
172
197
  }
@@ -393,18 +418,26 @@ Plugin.init = async function (params) {
393
418
  const uid = req.uid;
394
419
  const today = new Date().toISOString().slice(0, 10).replace(/-/g, '');
395
420
 
421
+ const earnGroupNames = Object.keys(EARN_RATES);
422
+
396
423
  // Veritabanından verileri çek
397
424
  const [userData, dailyData, actionCounts, historyRaw, memberChecks] = await Promise.all([
398
425
  user.getUserFields(uid, ['niki_points']),
399
426
  db.getObject(`niki:daily:${uid}:${today}`),
400
427
  db.getObject(`niki:daily:${uid}:${today}:counts`),
401
428
  db.getListRange(`niki:activity:${uid}`, 0, -1),
402
- Promise.all(WALLET_GROUPS.map(g => groups.isMember(uid, g))),
429
+ Promise.all(earnGroupNames.map(g => groups.isMember(uid, g))),
403
430
  ]);
404
431
 
405
- // Kullanıcı WALLET_GROUPS'dan herhangi birinde mi?
406
- const canRedeem = memberChecks.some(Boolean);
407
- const userGroup = canRedeem ? WALLET_GROUPS[memberChecks.indexOf(true)] : null;
432
+ // En yüksek kazanım grubunu seç (üye olduğu birden fazla varsa en iyisi).
433
+ let earnRate = DEFAULT_EARN_RATE;
434
+ let userGroup = null;
435
+ earnGroupNames.forEach((g, i) => {
436
+ if (memberChecks[i] && EARN_RATES[g] > earnRate) {
437
+ earnRate = EARN_RATES[g];
438
+ userGroup = g;
439
+ }
440
+ });
408
441
 
409
442
  const dailyScore = parseFloat(dailyData?.score || 0);
410
443
  let dailyPercent = (dailyScore / SETTINGS.dailyCap) * 100;
@@ -421,9 +454,10 @@ Plugin.init = async function (params) {
421
454
  actions: ACTIONS,
422
455
  history,
423
456
  rewards: REWARDS,
424
- canRedeem,
457
+ canRedeem: true,
425
458
  userGroup,
426
- walletGroups: WALLET_GROUPS,
459
+ earnRate,
460
+ walletGroups: earnGroupNames,
427
461
  });
428
462
  } catch (err) {
429
463
  return res.status(500).json({ points: 0, history: [] });
@@ -543,12 +577,6 @@ Plugin.init = async function (params) {
543
577
  try {
544
578
  const uid = req.uid;
545
579
 
546
- // Grup kontrolü
547
- const memberChecks = await Promise.all(WALLET_GROUPS.map(g => groups.isMember(uid, g)));
548
- if (!memberChecks.some(Boolean)) {
549
- return res.json({ success: false, message: 'Ödül kullanmak için Premium, Lite veya VIP grubuna katılmalısın.' });
550
- }
551
-
552
580
  const rewardIndex = parseInt(req.body.rewardIndex, 10);
553
581
  const points = parseFloat((await user.getUserField(uid, 'niki_points')) || 0);
554
582
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nodebb-plugin-niki-loyalty",
3
- "version": "1.5.9",
3
+ "version": "1.6.0",
4
4
  "description": "Niki The Cat Coffee Loyalty System - Earn points while studying on IEU Forum.",
5
5
  "main": "library.js",
6
6
  "nbbpm": {
package/plugin.json CHANGED
@@ -51,5 +51,5 @@
51
51
  "less": [
52
52
  "static/style.less"
53
53
  ],
54
- "templates": "./static/templates"
54
+ "templates": "static/templates"
55
55
  }
@@ -1,35 +1,30 @@
1
1
  'use strict';
2
2
 
3
3
  define('admin/plugins/niki-loyalty', ['settings', 'alerts'], function (Settings, alerts) {
4
- var ACP = {};
4
+ var ACP = {};
5
5
 
6
- ACP.init = function () {
7
- Settings.load('niki-loyalty', $('#niki-loyalty-settings'));
6
+ ACP.init = function () {
7
+ console.log('[NIKI ADMIN] init çalıştı');
8
+ console.log('[NIKI ADMIN] form bulundu mu:', $('#niki-loyalty-settings').length);
8
9
 
9
- $('#save').on('click', function () {
10
- Settings.save('niki-loyalty', $('#niki-loyalty-settings'), function () {
11
- // Sunucu tarafında ayarları anında uygula
12
- socket.emit('plugins.niki.reloadSettings', {}, function (err) {
13
- if (err) {
14
- return alerts.alert({
15
- type: 'danger',
16
- alert_id: 'niki-loyalty-error',
17
- title: 'Hata',
18
- message: 'Ayarlar kaydedildi ama sunucuya uygulanamadı. NodeBB\'yi yeniden başlatın.',
19
- timeout: 5000,
20
- });
21
- }
22
- alerts.alert({
23
- type: 'success',
24
- alert_id: 'niki-loyalty-saved',
25
- title: 'Ayarlar Kaydedildi',
26
- message: 'Niki Loyalty ayarları kaydedildi ve anında uygulandı.',
27
- timeout: 2500,
28
- });
29
- });
30
- });
31
- });
32
- };
10
+ Settings.load('niki-loyalty', $('#niki-loyalty-settings'), function () {
11
+ console.log('[NIKI ADMIN] Settings.load tamamlandı');
12
+ });
33
13
 
34
- return ACP;
14
+ $('#save').on('click', function () {
15
+ console.log('[NIKI ADMIN] Kaydet butonuna basıldı');
16
+ Settings.save('niki-loyalty', $('#niki-loyalty-settings'), function () {
17
+ console.log('[NIKI ADMIN] Settings.save tamamlandı');
18
+ alerts.alert({
19
+ type: 'success',
20
+ alert_id: 'niki-loyalty-saved',
21
+ title: 'Ayarlar Kaydedildi',
22
+ message: 'Niki Loyalty ayarları kaydedildi. Uygulamak için NodeBB\'yi yeniden başlatın.',
23
+ timeout: 3000,
24
+ });
25
+ });
26
+ });
27
+ };
28
+
29
+ return ACP;
35
30
  });
@@ -330,6 +330,42 @@ $(document).ready(function () {
330
330
  $('#daily-score').text(formatPoints(data.dailyScore));
331
331
  $('#daily-cap').text(data.dailyCap);
332
332
 
333
+ // Kademeli upsell rozeti: bir üst kademeyi göster (VIP'te yok)
334
+ $('#niki-earn-rate-badge').remove();
335
+ const TIERS = [
336
+ { rate: 0.5, label: null },
337
+ { rate: 1.0, label: 'Lite' },
338
+ { rate: 1.25, label: 'Premium' },
339
+ { rate: 1.5, label: 'VIP' },
340
+ ];
341
+ const currentRate = parseFloat(data.earnRate) || 0.5;
342
+ const currentIdx = TIERS.findIndex(t => Math.abs(t.rate - currentRate) < 0.01);
343
+ const nextTier = currentIdx >= 0 ? TIERS[currentIdx + 1] : null;
344
+
345
+ if (nextTier && $('#user-points').length) {
346
+ const factor = (nextTier.rate / currentRate).toFixed(2).replace(/\.?0+$/, '');
347
+ const badgeHtml = `
348
+ <div id="niki-earn-rate-badge" style="
349
+ display: inline-flex;
350
+ align-items: center;
351
+ gap: 6px;
352
+ margin-top: 10px;
353
+ padding: 6px 12px;
354
+ background: linear-gradient(135deg, #FFD700 0%, #FFA000 100%);
355
+ color: #3E2723;
356
+ border-radius: 20px;
357
+ font-size: 12px;
358
+ font-weight: 700;
359
+ box-shadow: 0 2px 6px rgba(0,0,0,0.15);
360
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
361
+ ">
362
+ <span>💎</span>
363
+ <span>${nextTier.label} ile <strong style="font-size:13px;">${factor}x</strong> daha hızlı kazan</span>
364
+ </div>
365
+ `;
366
+ $('#user-points').after(badgeHtml);
367
+ }
368
+
333
369
  // Progress Bar
334
370
  const percent = data.dailyPercent > 100 ? 100 : data.dailyPercent;
335
371
  $('#daily-progress').css('width', percent + '%').text(Math.round(percent) + '%');
@@ -1,135 +1,123 @@
1
1
  <div class="acp-page-container">
2
- <div class="col-12 col-md-10 col-lg-8 px-0 mx-auto">
3
-
4
- <div class="d-flex justify-content-between align-items-center mb-4">
5
- <h4 class="fw-bold mb-0"><i class="fa fa-coffee text-warning"></i> Niki Loyalty Ayarları</h4>
6
- <button id="save" class="btn btn-primary btn-sm">
7
- <i class="fa fa-save"></i> Kaydet
8
- </button>
9
- </div>
10
-
11
- <form id="niki-loyalty-settings">
12
-
13
- <!-- GENEL AYARLAR -->
14
- <div class="card mb-4">
15
- <div class="card-header fw-bold"><i class="fa fa-cog"></i> Genel Ayarlar</div>
16
- <div class="card-body">
17
- <div class="row">
18
- <div class="col-md-6 mb-3">
19
- <label class="form-label fw-semibold">Günlük Maksimum Puan Limiti</label>
20
- <input type="number" class="form-control" data-key="dailyCap" placeholder="35">
21
- <div class="form-text">Bir kullanıcının günde kazanabileceği maksimum puan.</div>
22
- </div>
23
- </div>
24
- </div>
25
- </div>
26
-
27
- <!-- PUAN TABLOSU -->
28
- <div class="card mb-4">
29
- <div class="card-header fw-bold"><i class="fa fa-star text-warning"></i> Puan Tablosu</div>
30
- <div class="card-body">
31
- <div class="table-responsive">
32
- <table class="table table-hover align-middle mb-0">
33
- <thead>
34
- <tr>
35
- <th style="width:30%">Aksiyon</th>
36
- <th style="width:35%">Puan</th>
37
- <th style="width:35%">Günlük Limit</th>
38
- </tr>
39
- </thead>
40
- <tbody>
41
- <tr>
42
- <td><i class="fa fa-sign-in text-purple"></i> Günlük Giriş</td>
43
- <td><input type="number" step="0.5" class="form-control form-control-sm" data-key="login_points" placeholder="5"></td>
44
- <td><input type="number" class="form-control form-control-sm" data-key="login_limit" placeholder="1"></td>
45
- </tr>
46
- <tr>
47
- <td><i class="fa fa-pencil text-primary"></i> Yeni Konu</td>
48
- <td><input type="number" step="0.5" class="form-control form-control-sm" data-key="new_topic_points" placeholder="5"></td>
49
- <td><input type="number" class="form-control form-control-sm" data-key="new_topic_limit" placeholder="1"></td>
50
- </tr>
51
- <tr>
52
- <td><i class="fa fa-commenting text-success"></i> Yorum Yazma</td>
53
- <td><input type="number" step="0.5" class="form-control form-control-sm" data-key="reply_points" placeholder="5"></td>
54
- <td><input type="number" class="form-control form-control-sm" data-key="reply_limit" placeholder="2"></td>
55
- </tr>
56
- <tr>
57
- <td><i class="fa fa-book text-warning"></i> Konu Okuma</td>
58
- <td><input type="number" step="0.5" class="form-control form-control-sm" data-key="read_points" placeholder="1"></td>
59
- <td><input type="number" class="form-control form-control-sm" data-key="read_limit" placeholder="10"></td>
60
- </tr>
61
- <tr>
62
- <td><i class="fa fa-heart text-danger"></i> Beğeni Atma</td>
63
- <td><input type="number" step="0.5" class="form-control form-control-sm" data-key="like_given_points" placeholder="2.5"></td>
64
- <td><input type="number" class="form-control form-control-sm" data-key="like_given_limit" placeholder="2"></td>
65
- </tr>
66
- <tr>
67
- <td><i class="fa fa-star text-info"></i> Beğeni Alma</td>
68
- <td><input type="number" step="0.5" class="form-control form-control-sm" data-key="like_taken_points" placeholder="5"></td>
69
- <td><input type="number" class="form-control form-control-sm" data-key="like_taken_limit" placeholder="2"></td>
70
- </tr>
71
- </tbody>
72
- </table>
73
- </div>
74
- <div class="form-text mt-2">Placeholder'daki değerler varsayılan değerlerdir. Boş bırakırsanız varsayılan kullanılır.</div>
75
- </div>
76
- </div>
77
-
78
- <!-- ÖDÜLLER -->
79
- <div class="card mb-4">
80
- <div class="card-header fw-bold"><i class="fa fa-gift text-danger"></i> Ödüller</div>
81
- <div class="card-body">
82
- <div class="table-responsive">
83
- <table class="table table-hover align-middle mb-0">
84
- <thead>
85
- <tr>
86
- <th style="width:60%">Ödül Adı</th>
87
- <th style="width:40%">Gerekli Puan</th>
88
- </tr>
89
- </thead>
90
- <tbody>
91
- <tr>
92
- <td><input type="text" class="form-control form-control-sm" data-key="reward0_name" placeholder="Ücretsiz Kahve ☕"></td>
93
- <td><input type="number" class="form-control form-control-sm" data-key="reward0_cost" placeholder="250"></td>
94
- </tr>
95
- <tr>
96
- <td><input type="text" class="form-control form-control-sm" data-key="reward1_name" placeholder="%60 İndirimli Kahve"></td>
97
- <td><input type="number" class="form-control form-control-sm" data-key="reward1_cost" placeholder="180"></td>
98
- </tr>
99
- <tr>
100
- <td><input type="text" class="form-control form-control-sm" data-key="reward2_name" placeholder="%30 İndirimli Kahve"></td>
101
- <td><input type="number" class="form-control form-control-sm" data-key="reward2_cost" placeholder="120"></td>
102
- </tr>
103
- <tr>
104
- <td><input type="text" class="form-control form-control-sm" data-key="reward3_name" placeholder="1 Kurabiye 🍪"></td>
105
- <td><input type="number" class="form-control form-control-sm" data-key="reward3_cost" placeholder="60"></td>
106
- </tr>
107
- </tbody>
108
- </table>
109
- </div>
110
- </div>
111
- </div>
112
-
113
- <!-- GRUP BONUSLARI -->
114
- <div class="card mb-4">
115
- <div class="card-header fw-bold"><i class="fa fa-users text-success"></i> Grup Katılım Bonusları</div>
116
- <div class="card-body">
117
- <div class="row">
118
- <div class="col-md-6 mb-3">
119
- <label class="form-label fw-semibold">Premium Grup Bonusu</label>
120
- <input type="number" class="form-control" data-key="bonus_premium" placeholder="30">
121
- <div class="form-text">Premium grubuna katılan kullanıcıya verilecek bonus puan.</div>
122
- </div>
123
- <div class="col-md-6 mb-3">
124
- <label class="form-label fw-semibold">VIP Grup Bonusu</label>
125
- <input type="number" class="form-control" data-key="bonus_vip" placeholder="60">
126
- <div class="form-text">VIP grubuna katılan kullanıcıya verilecek bonus puan.</div>
127
- </div>
128
- </div>
129
- </div>
130
- </div>
131
-
132
- </form>
133
-
134
- </div>
2
+ <div class="col-lg-9">
3
+
4
+ <div class="panel panel-default">
5
+ <div class="panel-heading"><i class="fa fa-coffee"></i> Niki Loyalty Ayarları</div>
6
+ <div class="panel-body">
7
+
8
+ <form id="niki-loyalty-settings">
9
+
10
+ <!-- GENEL AYARLAR -->
11
+ <fieldset>
12
+ <legend>Genel Ayarlar</legend>
13
+ <div class="form-group">
14
+ <label for="dailyCap">Günlük Maksimum Puan Limiti</label>
15
+ <input type="number" id="dailyCap" name="dailyCap" data-key="dailyCap" class="form-control" placeholder="35">
16
+ <p class="help-block">Bir kullanıcının günde kazanabileceği maksimum puan.</p>
17
+ </div>
18
+ </fieldset>
19
+
20
+ <hr/>
21
+
22
+ <!-- PUAN TABLOSU -->
23
+ <fieldset>
24
+ <legend>Puan Tablosu</legend>
25
+
26
+ <div class="row">
27
+ <div class="col-sm-4"><strong>Aksiyon</strong></div>
28
+ <div class="col-sm-4"><strong>Puan</strong></div>
29
+ <div class="col-sm-4"><strong>Günlük Limit</strong></div>
30
+ </div>
31
+ <hr style="margin:5px 0 10px"/>
32
+
33
+ <div class="row form-group">
34
+ <div class="col-sm-4"><label><i class="fa fa-sign-in"></i> Günlük Giriş</label></div>
35
+ <div class="col-sm-4"><input type="number" step="0.5" id="login_points" name="login_points" data-key="login_points" class="form-control" placeholder="5"></div>
36
+ <div class="col-sm-4"><input type="number" id="login_limit" name="login_limit" data-key="login_limit" class="form-control" placeholder="1"></div>
37
+ </div>
38
+ <div class="row form-group">
39
+ <div class="col-sm-4"><label><i class="fa fa-pencil"></i> Yeni Konu</label></div>
40
+ <div class="col-sm-4"><input type="number" step="0.5" id="new_topic_points" name="new_topic_points" data-key="new_topic_points" class="form-control" placeholder="5"></div>
41
+ <div class="col-sm-4"><input type="number" id="new_topic_limit" name="new_topic_limit" data-key="new_topic_limit" class="form-control" placeholder="1"></div>
42
+ </div>
43
+ <div class="row form-group">
44
+ <div class="col-sm-4"><label><i class="fa fa-commenting"></i> Yorum Yazma</label></div>
45
+ <div class="col-sm-4"><input type="number" step="0.5" id="reply_points" name="reply_points" data-key="reply_points" class="form-control" placeholder="5"></div>
46
+ <div class="col-sm-4"><input type="number" id="reply_limit" name="reply_limit" data-key="reply_limit" class="form-control" placeholder="2"></div>
47
+ </div>
48
+ <div class="row form-group">
49
+ <div class="col-sm-4"><label><i class="fa fa-book"></i> Konu Okuma</label></div>
50
+ <div class="col-sm-4"><input type="number" step="0.5" id="read_points" name="read_points" data-key="read_points" class="form-control" placeholder="1"></div>
51
+ <div class="col-sm-4"><input type="number" id="read_limit" name="read_limit" data-key="read_limit" class="form-control" placeholder="10"></div>
52
+ </div>
53
+ <div class="row form-group">
54
+ <div class="col-sm-4"><label><i class="fa fa-heart"></i> Beğeni Atma</label></div>
55
+ <div class="col-sm-4"><input type="number" step="0.5" id="like_given_points" name="like_given_points" data-key="like_given_points" class="form-control" placeholder="2.5"></div>
56
+ <div class="col-sm-4"><input type="number" id="like_given_limit" name="like_given_limit" data-key="like_given_limit" class="form-control" placeholder="2"></div>
57
+ </div>
58
+ <div class="row form-group">
59
+ <div class="col-sm-4"><label><i class="fa fa-star"></i> Beğeni Alma</label></div>
60
+ <div class="col-sm-4"><input type="number" step="0.5" id="like_taken_points" name="like_taken_points" data-key="like_taken_points" class="form-control" placeholder="5"></div>
61
+ <div class="col-sm-4"><input type="number" id="like_taken_limit" name="like_taken_limit" data-key="like_taken_limit" class="form-control" placeholder="2"></div>
62
+ </div>
63
+
64
+ <p class="help-block">Boş bırakırsanız placeholder'daki varsayılan değer kullanılır.</p>
65
+ </fieldset>
66
+
67
+ <hr/>
68
+
69
+ <!-- ÖDÜLLER -->
70
+ <fieldset>
71
+ <legend>Ödüller</legend>
72
+
73
+ <div class="row">
74
+ <div class="col-sm-8"><strong>Ödül Adı</strong></div>
75
+ <div class="col-sm-4"><strong>Gerekli Puan</strong></div>
76
+ </div>
77
+ <hr style="margin:5px 0 10px"/>
78
+
79
+ <div class="row form-group">
80
+ <div class="col-sm-8"><input type="text" id="reward0_name" name="reward0_name" data-key="reward0_name" class="form-control" placeholder="Ücretsiz Kahve"></div>
81
+ <div class="col-sm-4"><input type="number" id="reward0_cost" name="reward0_cost" data-key="reward0_cost" class="form-control" placeholder="250"></div>
82
+ </div>
83
+ <div class="row form-group">
84
+ <div class="col-sm-8"><input type="text" id="reward1_name" name="reward1_name" data-key="reward1_name" class="form-control" placeholder="%60 İndirimli Kahve"></div>
85
+ <div class="col-sm-4"><input type="number" id="reward1_cost" name="reward1_cost" data-key="reward1_cost" class="form-control" placeholder="180"></div>
86
+ </div>
87
+ <div class="row form-group">
88
+ <div class="col-sm-8"><input type="text" id="reward2_name" name="reward2_name" data-key="reward2_name" class="form-control" placeholder="%30 İndirimli Kahve"></div>
89
+ <div class="col-sm-4"><input type="number" id="reward2_cost" name="reward2_cost" data-key="reward2_cost" class="form-control" placeholder="120"></div>
90
+ </div>
91
+ <div class="row form-group">
92
+ <div class="col-sm-8"><input type="text" id="reward3_name" name="reward3_name" data-key="reward3_name" class="form-control" placeholder="1 Kurabiye"></div>
93
+ <div class="col-sm-4"><input type="number" id="reward3_cost" name="reward3_cost" data-key="reward3_cost" class="form-control" placeholder="60"></div>
94
+ </div>
95
+ </fieldset>
96
+
97
+ <hr/>
98
+
99
+ <!-- GRUP BONUSLARI -->
100
+ <fieldset>
101
+ <legend>Grup Katılım Bonusları</legend>
102
+ <div class="form-group">
103
+ <label for="bonus_premium">Premium Grup Bonusu</label>
104
+ <input type="number" id="bonus_premium" name="bonus_premium" data-key="bonus_premium" class="form-control" placeholder="30">
105
+ <p class="help-block">Premium grubuna katılan kullanıcıya verilecek bonus puan.</p>
106
+ </div>
107
+ <div class="form-group">
108
+ <label for="bonus_vip">VIP Grup Bonusu</label>
109
+ <input type="number" id="bonus_vip" name="bonus_vip" data-key="bonus_vip" class="form-control" placeholder="60">
110
+ <p class="help-block">VIP grubuna katılan kullanıcıya verilecek bonus puan.</p>
111
+ </div>
112
+ </fieldset>
113
+
114
+ </form>
115
+ </div>
116
+ </div>
117
+
118
+ <button class="btn btn-primary" id="save">
119
+ <i class="fa fa-save"></i> Kaydet
120
+ </button>
121
+
122
+ </div>
135
123
  </div>