Files
worker/lib/features/home/domain/entities/member_card.dart
Phuoc Nguyen 57bf73e4d1 update
2025-10-17 17:49:01 +07:00

170 lines
3.8 KiB
Dart

/// Domain Entity: Member Card
///
/// Represents a member card with tier information, points, and QR code data.
/// This entity is used across the home feature to display membership information.
///
/// Tiers: Diamond, Platinum, Gold
///
/// This is a pure domain entity with no external dependencies.
library;
/// Member tier enum
enum MemberTier {
/// Diamond tier - highest tier
diamond,
/// Platinum tier - middle tier
platinum,
/// Gold tier - entry tier
gold;
/// Get display name for tier
String get displayName {
switch (this) {
case MemberTier.diamond:
return 'DIAMOND';
case MemberTier.platinum:
return 'PLATINUM';
case MemberTier.gold:
return 'GOLD';
}
}
}
/// Member type enum
enum MemberType {
/// Architect member type
architect,
/// Contractor member type
contractor,
/// Distributor member type
distributor,
/// Broker member type
broker;
/// Get display name for member type
String get displayName {
switch (this) {
case MemberType.architect:
return 'ARCHITECT MEMBERSHIP';
case MemberType.contractor:
return 'CONTRACTOR MEMBERSHIP';
case MemberType.distributor:
return 'DISTRIBUTOR MEMBERSHIP';
case MemberType.broker:
return 'BROKER MEMBERSHIP';
}
}
}
/// Member Card Entity
///
/// Contains all information needed to display a member card:
/// - Personal info (name, member ID)
/// - Membership details (tier, type, valid until)
/// - Loyalty points
/// - QR code data for scanning
class MemberCard {
/// Unique member ID
final String memberId;
/// Member's full name
final String name;
/// Member type (Architect, Contractor, etc.)
final MemberType memberType;
/// Current membership tier
final MemberTier tier;
/// Current loyalty points balance
final int points;
/// Card expiration date
final DateTime validUntil;
/// QR code data (typically member ID or encoded data)
final String qrData;
/// Constructor
const MemberCard({
required this.memberId,
required this.name,
required this.memberType,
required this.tier,
required this.points,
required this.validUntil,
required this.qrData,
});
/// Check if card is expired
bool get isExpired => DateTime.now().isAfter(validUntil);
/// Check if card is expiring soon (within 30 days)
bool get isExpiringSoon {
final daysUntilExpiry = validUntil.difference(DateTime.now()).inDays;
return daysUntilExpiry > 0 && daysUntilExpiry <= 30;
}
/// Copy with method for immutability
MemberCard copyWith({
String? memberId,
String? name,
MemberType? memberType,
MemberTier? tier,
int? points,
DateTime? validUntil,
String? qrData,
}) {
return MemberCard(
memberId: memberId ?? this.memberId,
name: name ?? this.name,
memberType: memberType ?? this.memberType,
tier: tier ?? this.tier,
points: points ?? this.points,
validUntil: validUntil ?? this.validUntil,
qrData: qrData ?? this.qrData,
);
}
/// Equality operator
@override
bool operator ==(Object other) {
if (identical(this, other)) return true;
return other is MemberCard &&
other.memberId == memberId &&
other.name == name &&
other.memberType == memberType &&
other.tier == tier &&
other.points == points &&
other.validUntil == validUntil &&
other.qrData == qrData;
}
/// Hash code
@override
int get hashCode {
return Object.hash(
memberId,
name,
memberType,
tier,
points,
validUntil,
qrData,
);
}
/// String representation
@override
String toString() {
return 'MemberCard(memberId: $memberId, name: $name, memberType: $memberType, '
'tier: $tier, points: $points, validUntil: $validUntil, qrData: $qrData)';
}
}