50 lines
1.5 KiB
Dart
50 lines
1.5 KiB
Dart
/// Representa um convite pendente no sistema
|
|
class Invite {
|
|
final String id;
|
|
final String email;
|
|
final String role;
|
|
final String? phone; // para encarregados — número do terminal
|
|
final String invitedBy; // profile_id do principal que convidou
|
|
final String status; // pending | accepted | rejected | expired
|
|
final DateTime createdAt;
|
|
final DateTime expiresAt;
|
|
final String? childId; // para encarregados — ligação à criança
|
|
|
|
Invite({
|
|
required this.id,
|
|
required this.email,
|
|
required this.role,
|
|
this.phone,
|
|
required this.invitedBy,
|
|
required this.status,
|
|
required this.createdAt,
|
|
required this.expiresAt,
|
|
this.childId,
|
|
});
|
|
|
|
factory Invite.fromMap(Map<String, dynamic> m) => Invite(
|
|
id: m['id'] ?? '',
|
|
email: m['email'] ?? '',
|
|
role: m['role'] ?? 'parent',
|
|
phone: m['phone'],
|
|
invitedBy: m['invited_by'] ?? '',
|
|
status: m['status'] ?? 'pending',
|
|
createdAt: DateTime.tryParse(m['created_at'] ?? '') ?? DateTime.now(),
|
|
expiresAt: DateTime.tryParse(m['expires_at'] ?? '') ?? DateTime.now().add(const Duration(days: 7)),
|
|
childId: m['child_id'],
|
|
);
|
|
|
|
bool get isExpired => DateTime.now().isAfter(expiresAt);
|
|
bool get isPending => status == 'pending' && !isExpired;
|
|
|
|
Map<String, dynamic> toMap() => {
|
|
'email': email,
|
|
'role': role,
|
|
'phone': phone,
|
|
'invited_by': invitedBy,
|
|
'status': status,
|
|
'expires_at': expiresAt.toIso8601String(),
|
|
'child_id': childId,
|
|
};
|
|
}
|