EnakPromo: halaman promo dan detail promo
- Banner promo unggulan, info cara dapat, filter per tipe hadiah, daftar promo berlangsung dan segera hadir - Detail promo: hadiah, periode, outlet, cara dapat, S&K, CTA ke Reward Saya atau daftar outlet - Data contoh mengikuti bentuk campaign backend (POINTS/COINS/REWARD) - Filter chip Reward Saya dipindah ke komponen bersama FilterBarDelegate Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
bc751246d8
commit
c35d0eedbe
@@ -0,0 +1,209 @@
|
||||
// Models
|
||||
//
|
||||
// Mengikuti bentuk campaign di backend: tipe hadiah (POINTS / COINS / REWARD)
|
||||
// dengan satu aturan (min. belanja, menu, hari, atau outlet) dan periode.
|
||||
|
||||
/// Hadiah yang didapat customer dari promo.
|
||||
enum PromoType { point, coin, reward }
|
||||
|
||||
class Promo {
|
||||
final String id;
|
||||
final String title;
|
||||
|
||||
/// Satu kalimat pendek untuk kartu.
|
||||
final String subtitle;
|
||||
final PromoType type;
|
||||
|
||||
/// Hadiah dalam bentuk ringkas, mis. "2x EnakPoint" atau "+3 EnakCoin".
|
||||
final String rewardLabel;
|
||||
final String description;
|
||||
final List<String> steps;
|
||||
final List<String> terms;
|
||||
|
||||
/// Kosong berarti berlaku di semua outlet.
|
||||
final List<String> outlets;
|
||||
final DateTime startDate;
|
||||
final DateTime endDate;
|
||||
final bool isFeatured;
|
||||
|
||||
const Promo({
|
||||
required this.id,
|
||||
required this.title,
|
||||
required this.subtitle,
|
||||
required this.type,
|
||||
required this.rewardLabel,
|
||||
required this.description,
|
||||
required this.steps,
|
||||
required this.terms,
|
||||
required this.startDate,
|
||||
required this.endDate,
|
||||
this.outlets = const [],
|
||||
this.isFeatured = false,
|
||||
});
|
||||
}
|
||||
|
||||
// Sample Data
|
||||
//
|
||||
// 1 EnakPoint = potongan Rp 1. Belanja biasa memberi sekitar 1% EnakPoint.
|
||||
DateTime _daysAgo(int days) => DateTime.now().subtract(Duration(days: days));
|
||||
DateTime _daysFromNow(int days) => DateTime.now().add(Duration(days: days));
|
||||
|
||||
const String _stepLinkPhone =
|
||||
'Sebutkan nomor HP akunmu ke kasir sebelum membayar.';
|
||||
|
||||
/// Getter, bukan `final`, supaya perubahan data langsung terbaca saat hot
|
||||
/// reload (variabel global yang sudah terisi tidak diisi ulang).
|
||||
List<Promo> get promoSamples => [
|
||||
Promo(
|
||||
id: 'p1',
|
||||
title: 'Double EnakPoint Akhir Pekan',
|
||||
subtitle: 'Semua belanja Sabtu & Minggu dapat EnakPoint 2x lipat',
|
||||
type: PromoType.point,
|
||||
rewardLabel: '2x EnakPoint',
|
||||
description:
|
||||
'Belanja di akhir pekan jadi lebih untung. Setiap transaksi pada hari '
|
||||
'Sabtu dan Minggu mendapat EnakPoint dua kali lipat dari biasanya.',
|
||||
steps: [
|
||||
'Belanja di outlet mana pun pada hari Sabtu atau Minggu.',
|
||||
_stepLinkPhone,
|
||||
'EnakPoint 2x otomatis masuk setelah pesanan lunas.',
|
||||
],
|
||||
terms: [
|
||||
'Berlaku untuk semua menu, kecuali pembelian EnakCoin.',
|
||||
'Bonus dihitung dari total belanja setelah diskon.',
|
||||
'Maksimal bonus 5.000 EnakPoint per transaksi.',
|
||||
],
|
||||
startDate: _daysAgo(6),
|
||||
endDate: _daysFromNow(24),
|
||||
isFeatured: true,
|
||||
),
|
||||
Promo(
|
||||
id: 'p2',
|
||||
title: 'Ngopi Dapat EnakCoin',
|
||||
subtitle: 'Setiap Kopi Susu di Tumulu Coffee dapat +3 EnakCoin',
|
||||
type: PromoType.coin,
|
||||
rewardLabel: '+3 EnakCoin',
|
||||
description:
|
||||
'Kopi pagi sekaligus modal main EnakGame. Setiap pembelian Kopi Susu '
|
||||
'di Tumulu Coffee memberi 3 EnakCoin tambahan.',
|
||||
steps: [
|
||||
'Pesan Kopi Susu ukuran apa pun di Tumulu Coffee.',
|
||||
_stepLinkPhone,
|
||||
'EnakCoin masuk otomatis setelah pesanan lunas.',
|
||||
],
|
||||
terms: [
|
||||
'Berlaku kelipatan: 2 Kopi Susu = +6 EnakCoin.',
|
||||
'Maksimal 15 EnakCoin per hari.',
|
||||
],
|
||||
outlets: ['Tumulu Coffee'],
|
||||
startDate: _daysAgo(4),
|
||||
endDate: _daysFromNow(10),
|
||||
isFeatured: true,
|
||||
),
|
||||
Promo(
|
||||
id: 'p3',
|
||||
title: 'Belanja Rp 100 Ribu, Bonus 2.000 EnakPoint',
|
||||
subtitle: 'Bonus langsung untuk belanja minimal Rp 100.000',
|
||||
type: PromoType.point,
|
||||
rewardLabel: '+2.000 EnakPoint',
|
||||
description:
|
||||
'Dapatkan bonus 2.000 EnakPoint, setara potongan Rp 2.000 di belanja '
|
||||
'berikutnya, untuk setiap transaksi minimal Rp 100.000.',
|
||||
steps: [
|
||||
'Belanja minimal Rp 100.000 dalam satu transaksi.',
|
||||
_stepLinkPhone,
|
||||
'Bonus masuk otomatis, di luar EnakPoint belanja biasa.',
|
||||
],
|
||||
terms: [
|
||||
'Minimum belanja dihitung sebelum pajak.',
|
||||
'Berlaku 1 kali per customer per hari.',
|
||||
],
|
||||
startDate: _daysAgo(12),
|
||||
endDate: _daysFromNow(2),
|
||||
),
|
||||
Promo(
|
||||
id: 'p4',
|
||||
title: 'Gratis Es Teh Manis',
|
||||
subtitle: 'Belanja Rp 50.000 di Bakso 343, dapat reward Es Teh Manis',
|
||||
type: PromoType.reward,
|
||||
rewardLabel: 'Gratis Es Teh',
|
||||
description:
|
||||
'Makan bakso makin segar. Belanja minimal Rp 50.000 di Bakso 343 dan '
|
||||
'dapatkan reward 1 Es Teh Manis untuk kunjungan berikutnya.',
|
||||
steps: [
|
||||
'Belanja minimal Rp 50.000 di Bakso 343.',
|
||||
_stepLinkPhone,
|
||||
'Reward masuk ke Reward Saya dan berlaku 14 hari.',
|
||||
],
|
||||
terms: [
|
||||
'Reward hanya bisa dipakai di Bakso 343.',
|
||||
'Maksimal 1 reward per customer per hari.',
|
||||
],
|
||||
outlets: ['Bakso 343'],
|
||||
startDate: _daysAgo(2),
|
||||
endDate: _daysFromNow(14),
|
||||
isFeatured: true,
|
||||
),
|
||||
Promo(
|
||||
id: 'p5',
|
||||
title: 'Rabu Ramen',
|
||||
subtitle: 'Setiap Rabu, tiap porsi ramen dapat +1.500 EnakPoint',
|
||||
type: PromoType.point,
|
||||
rewardLabel: '+1.500 EnakPoint',
|
||||
description:
|
||||
'Hari Rabu jadi hari ramen. Setiap porsi ramen di Ramenmulu pada hari '
|
||||
'Rabu memberi bonus 1.500 EnakPoint.',
|
||||
steps: [
|
||||
'Pesan ramen di Ramenmulu pada hari Rabu.',
|
||||
_stepLinkPhone,
|
||||
'Bonus masuk otomatis setelah pesanan lunas.',
|
||||
],
|
||||
terms: [
|
||||
'Berlaku untuk semua varian ramen, tidak termasuk topping.',
|
||||
'Maksimal 3 porsi per transaksi.',
|
||||
],
|
||||
outlets: ['Ramenmulu'],
|
||||
startDate: _daysAgo(20),
|
||||
endDate: _daysFromNow(21),
|
||||
),
|
||||
Promo(
|
||||
id: 'p6',
|
||||
title: 'Modal Main EnakGame',
|
||||
subtitle: 'Belanja Rp 75.000 dapat +5 EnakCoin',
|
||||
type: PromoType.coin,
|
||||
rewardLabel: '+5 EnakCoin',
|
||||
description:
|
||||
'Tambah kesempatan menang hadiah di EnakGame. Setiap belanja minimal '
|
||||
'Rp 75.000 memberi 5 EnakCoin tambahan.',
|
||||
steps: [
|
||||
'Belanja minimal Rp 75.000 di outlet mana pun.',
|
||||
_stepLinkPhone,
|
||||
'Pakai EnakCoin untuk main EnakGame.',
|
||||
],
|
||||
terms: [
|
||||
'Berlaku 1 kali per customer per hari.',
|
||||
'EnakCoin mengikuti masa berlaku yang diatur outlet.',
|
||||
],
|
||||
startDate: _daysAgo(1),
|
||||
endDate: _daysFromNow(7),
|
||||
),
|
||||
Promo(
|
||||
id: 'p7',
|
||||
title: 'Pekan Woku Pedas',
|
||||
subtitle: 'Menu apa pun di Woku Pedas dapat EnakPoint 3x lipat',
|
||||
type: PromoType.point,
|
||||
rewardLabel: '3x EnakPoint',
|
||||
description:
|
||||
'Rayakan pembukaan menu baru Woku Pedas. Selama sepekan, semua '
|
||||
'belanja di Woku Pedas mendapat EnakPoint tiga kali lipat.',
|
||||
steps: [
|
||||
'Belanja di Woku Pedas selama periode promo.',
|
||||
_stepLinkPhone,
|
||||
'EnakPoint 3x otomatis masuk setelah pesanan lunas.',
|
||||
],
|
||||
terms: ['Maksimal bonus 10.000 EnakPoint per transaksi.'],
|
||||
outlets: ['Woku Pedas'],
|
||||
startDate: _daysFromNow(3),
|
||||
endDate: _daysFromNow(10),
|
||||
),
|
||||
];
|
||||
Reference in New Issue
Block a user