part of '../wallet.dart'; /// Voucher di katalog yang bisa ditukar dengan EnakPoint sekarang (§9.1). @freezed abstract class Voucher with _$Voucher { const Voucher._(); const factory Voucher({ required String id, required String name, String? description, String? imageUrl, required VoucherType type, /// Nilai voucher dalam rupiah. required int faceValue, /// EnakPoint yang dipotong saat ditukar. required int pointCost, /// Batas tukar per customer; `null` berarti tanpa batas. int? maxPerCustomer, DateTime? validUntil, /// Sisa stok; `null` berarti stok tidak dihitung. int? available, }) = _Voucher; bool get isOutOfStock => available != null && available! <= 0; } /// Voucher hasil tukar milik customer (§9.3). @freezed abstract class VoucherRedemption with _$VoucherRedemption { const factory VoucherRedemption({ required String id, required String voucherId, required String voucherName, String? voucherImageUrl, required VoucherType voucherType, required VoucherRedemptionStatus status, required int faceValue, required int pointCost, /// `null` bila voucher tidak memakai kode; customer menunjukkan layar /// voucher ke kasir. String? code, DateTime? codeExpiresAt, DateTime? completedAt, DateTime? createdAt, }) = _VoucherRedemption; } @freezed abstract class VoucherRedemptionPage with _$VoucherRedemptionPage { const factory VoucherRedemptionPage({ required List items, required int page, required int totalPages, }) = _VoucherRedemptionPage; } @freezed abstract class VoucherRedeemResult with _$VoucherRedeemResult { const factory VoucherRedeemResult({ required VoucherRedemption redemption, /// Saldo EnakPoint setelah ditukar. required int pointBalance, required bool replayed, }) = _VoucherRedeemResult; }