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.
- package/.claude/settings.local.json +4 -1
- package/library.js +44 -16
- package/package.json +1 -1
- package/plugin.json +1 -1
- package/static/lib/admin.js +23 -28
- package/static/lib/client.js +36 -0
- package/static/templates/admin/plugins/niki-loyalty.tpl +121 -133
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
|
-
//
|
|
14
|
-
|
|
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
|
-
|
|
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(
|
|
429
|
+
Promise.all(earnGroupNames.map(g => groups.isMember(uid, g))),
|
|
403
430
|
]);
|
|
404
431
|
|
|
405
|
-
//
|
|
406
|
-
|
|
407
|
-
|
|
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
|
-
|
|
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
package/plugin.json
CHANGED
package/static/lib/admin.js
CHANGED
|
@@ -1,35 +1,30 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
define('admin/plugins/niki-loyalty', ['settings', 'alerts'], function (Settings, alerts) {
|
|
4
|
-
|
|
4
|
+
var ACP = {};
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
|
|
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
|
-
|
|
10
|
-
|
|
11
|
-
|
|
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
|
-
|
|
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
|
});
|
package/static/lib/client.js
CHANGED
|
@@ -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
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
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>
|