// 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 steps; final List terms; /// Kosong berarti berlaku di semua outlet. final List 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 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), ), ];