140 lines
4.2 KiB
Dart
140 lines
4.2 KiB
Dart
// Models
|
|||
|
|
enum RewardStatus { active, used, expired }
|
||
|
|
|
||
|
|
class Reward {
|
||
|
|
final String id;
|
||
|
|
final String name;
|
||
|
|
final String emoji;
|
||
|
|
final String description;
|
||
|
|
final String categoryName;
|
||
|
|
final int pointsUsed;
|
||
|
|
final DateTime redeemedAt;
|
||
|
|
final DateTime validUntil;
|
||
|
|
final RewardStatus status;
|
||
|
|
final String? couponCode;
|
||
|
|
final DateTime? usedAt;
|
||
|
|
final String? termsAndConditions;
|
||
|
|
|
||
|
|
const Reward({
|
||
|
|
required this.id,
|
||
|
|
required this.name,
|
||
|
|
required this.emoji,
|
||
|
|
required this.description,
|
||
|
|
required this.categoryName,
|
||
|
|
required this.pointsUsed,
|
||
|
|
required this.redeemedAt,
|
||
|
|
required this.validUntil,
|
||
|
|
required this.status,
|
||
|
|
this.couponCode,
|
||
|
|
this.usedAt,
|
||
|
|
this.termsAndConditions,
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
// Sample Data
|
||
|
|
//
|
||
|
|
// 1 EnakPoint = potongan Rp 1, jadi harga reward dibuat sedikit di bawah harga
|
||
|
|
// menunya supaya menukar lebih untung daripada bayar langsung pakai poin.
|
||
|
|
// Menu gratis berlaku 14 hari dan voucher potongan 30 hari sejak ditukar.
|
||
|
|
DateTime _daysAgo(int days) => DateTime.now().subtract(Duration(days: days));
|
||
|
|
DateTime _daysFromNow(int days) => DateTime.now().add(Duration(days: days));
|
||
|
|
|
||
|
|
/// Getter, bukan `final`, supaya perubahan data langsung terbaca saat hot
|
||
|
|
/// reload (variabel global yang sudah terisi tidak diisi ulang).
|
||
|
|
List<Reward> get rewardSamples => [
|
||
|
|
Reward(
|
||
|
|
id: 'r1',
|
||
|
|
name: 'Kopi Susu',
|
||
|
|
emoji: '☕',
|
||
|
|
description: '1 Kopi Susu regular di Tumulu Coffee',
|
||
|
|
categoryName: 'Minuman',
|
||
|
|
pointsUsed: 20000,
|
||
|
|
redeemedAt: _daysAgo(11),
|
||
|
|
validUntil: _daysFromNow(3),
|
||
|
|
status: RewardStatus.active,
|
||
|
|
couponCode: 'ENK-7QM2PX',
|
||
|
|
termsAndConditions:
|
||
|
|
'Berlaku untuk 1 Kopi Susu ukuran regular di Tumulu Coffee, dine-in '
|
||
|
|
'atau take away. Upsize dan tambahan topping dibayar terpisah. '
|
||
|
|
'Tunjukkan kode ke kasir sebelum membayar.',
|
||
|
|
),
|
||
|
|
Reward(
|
||
|
|
id: 'r2',
|
||
|
|
name: 'Bakso Urat',
|
||
|
|
emoji: '🍲',
|
||
|
|
description: '1 porsi Bakso Urat di Bakso 343',
|
||
|
|
categoryName: 'Makanan',
|
||
|
|
pointsUsed: 18000,
|
||
|
|
redeemedAt: DateTime.now().subtract(const Duration(hours: 5)),
|
||
|
|
validUntil: _daysFromNow(14),
|
||
|
|
status: RewardStatus.active,
|
||
|
|
couponCode: 'ENK-B3HW8N',
|
||
|
|
termsAndConditions:
|
||
|
|
'Berlaku untuk 1 porsi Bakso Urat di Bakso 343, dine-in atau take '
|
||
|
|
'away. Tunjukkan kode ke kasir sebelum membayar.',
|
||
|
|
),
|
||
|
|
Reward(
|
||
|
|
id: 'r3',
|
||
|
|
name: 'Potongan Rp 10.000',
|
||
|
|
emoji: '🎟️',
|
||
|
|
description: 'Min. belanja Rp 50.000 di semua outlet',
|
||
|
|
categoryName: 'Voucher',
|
||
|
|
pointsUsed: 8000,
|
||
|
|
redeemedAt: _daysAgo(2),
|
||
|
|
validUntil: _daysFromNow(28),
|
||
|
|
status: RewardStatus.active,
|
||
|
|
couponCode: 'ENK-K9D4TR',
|
||
|
|
termsAndConditions:
|
||
|
|
'Berlaku untuk 1 transaksi dengan minimum belanja Rp 50.000 di semua '
|
||
|
|
'outlet. Tidak dapat digabung dengan voucher lain dan tidak dapat '
|
||
|
|
'diuangkan.',
|
||
|
|
),
|
||
|
|
Reward(
|
||
|
|
id: 'r4',
|
||
|
|
name: 'Es Teh Manis',
|
||
|
|
emoji: '🥤',
|
||
|
|
description: '1 gelas Es Teh Manis di semua outlet',
|
||
|
|
categoryName: 'Minuman',
|
||
|
|
pointsUsed: 4000,
|
||
|
|
redeemedAt: _daysAgo(9),
|
||
|
|
validUntil: _daysFromNow(5),
|
||
|
|
usedAt: _daysAgo(8),
|
||
|
|
status: RewardStatus.used,
|
||
|
|
couponCode: 'ENK-5TRJ6C',
|
||
|
|
termsAndConditions:
|
||
|
|
'Berlaku untuk 1 gelas Es Teh Manis ukuran regular di semua outlet.',
|
||
|
|
),
|
||
|
|
Reward(
|
||
|
|
id: 'r5',
|
||
|
|
name: 'Gyoza Goreng',
|
||
|
|
emoji: '🥟',
|
||
|
|
description: '5 pcs Gyoza goreng di Ramenmulu',
|
||
|
|
categoryName: 'Cemilan',
|
||
|
|
pointsUsed: 16000,
|
||
|
|
redeemedAt: _daysAgo(20),
|
||
|
|
validUntil: _daysAgo(6),
|
||
|
|
usedAt: _daysAgo(16),
|
||
|
|
status: RewardStatus.used,
|
||
|
|
couponCode: 'ENK-G8VL2F',
|
||
|
|
termsAndConditions:
|
||
|
|
'Berlaku untuk 1 porsi Gyoza goreng isi 5 di Ramenmulu. Tidak berlaku '
|
||
|
|
'untuk menu paket.',
|
||
|
|
),
|
||
|
|
Reward(
|
||
|
|
id: 'r6',
|
||
|
|
name: 'Potongan Rp 5.000',
|
||
|
|
emoji: '🎟️',
|
||
|
|
description: 'Min. belanja Rp 30.000 di semua outlet',
|
||
|
|
categoryName: 'Voucher',
|
||
|
|
pointsUsed: 4000,
|
||
|
|
redeemedAt: _daysAgo(50),
|
||
|
|
validUntil: _daysAgo(20),
|
||
|
|
status: RewardStatus.expired,
|
||
|
|
couponCode: 'ENK-P2XN7D',
|
||
|
|
termsAndConditions:
|
||
|
|
'Berlaku untuk 1 transaksi dengan minimum belanja Rp 30.000 di semua '
|
||
|
|
'outlet. Tidak dapat digabung dengan voucher lain dan tidak dapat '
|
||
|
|
'diuangkan.',
|
||
|
|
),
|
||
|
|
];
|