이벤트 개발완료

This commit is contained in:
2025-10-23 22:04:03 +09:00
parent ce1aee67d6
commit cd0e139b5e
48 changed files with 7855 additions and 3459 deletions
+77 -2
View File
@@ -16,6 +16,9 @@ class Participant {
final DateTime? createdAt;
final DateTime? updatedAt;
String? memberType; // 회원 유형 필드 추가: '정회원', '준회원', '게스트' 등
final String? gender; // 성별 (서버 Member.gender에서 유추)
final int? handicap; // 핸디캡 (서버 Member.handicap에서 유추)
final double? average; // 백엔드에서 제공하는 동적 에버리지(옵션)
Participant({
required this.id,
@@ -34,11 +37,60 @@ class Participant {
this.notes,
this.createdAt,
this.updatedAt,
this.gender,
this.handicap,
this.average,
});
Participant copyWith({
String? id,
String? eventId,
String? memberId,
String? name,
String? email,
String? phoneNumber,
String? status,
DateTime? registeredAt,
DateTime? confirmedAt,
DateTime? cancelledAt,
DateTime? attendedAt,
bool? isPaid,
double? paidAmount,
String? notes,
DateTime? createdAt,
DateTime? updatedAt,
String? gender,
int? handicap,
double? average,
String? memberType,
}) {
return Participant(
id: id ?? this.id,
eventId: eventId ?? this.eventId,
memberId: memberId ?? this.memberId,
name: name ?? this.name,
email: email ?? this.email,
phoneNumber: phoneNumber ?? this.phoneNumber,
status: status ?? this.status,
registeredAt: registeredAt ?? this.registeredAt,
confirmedAt: confirmedAt ?? this.confirmedAt,
cancelledAt: cancelledAt ?? this.cancelledAt,
attendedAt: attendedAt ?? this.attendedAt,
isPaid: isPaid ?? this.isPaid,
paidAmount: paidAmount ?? this.paidAmount,
notes: notes ?? this.notes,
createdAt: createdAt ?? this.createdAt,
updatedAt: updatedAt ?? this.updatedAt,
gender: gender ?? this.gender,
handicap: handicap ?? this.handicap,
average: average ?? this.average,
// preserve mutable memberType even though not in ctor params order earlier
)..memberType = memberType ?? this.memberType;
}
// JSON 데이터로부터 Participant 객체 생성
factory Participant.fromJson(Map<String, dynamic> json) {
return Participant(
final p = Participant(
id: json['id']?.toString() ?? '',
eventId: json['eventId']?.toString() ?? '',
memberId: json['memberId']?.toString() ?? '',
@@ -54,10 +106,29 @@ class Participant {
// 서버는 paymentStatus('paid'|'unpaid')를 줄 수 있으므로 이를 isPaid로 변환
isPaid: json['isPaid'] ?? (json['paymentStatus']?.toString().toLowerCase() == 'paid'),
paidAmount: json['paidAmount'] != null ? double.tryParse(json['paidAmount'].toString()) : null,
notes: json['notes']?.toString(),
notes: (json['notes'] ?? json['comment'])?.toString(),
createdAt: json['createdAt'] != null ? DateTime.parse(json['createdAt'].toString()) : null,
updatedAt: json['updatedAt'] != null ? DateTime.parse(json['updatedAt'].toString()) : null,
gender: (json['gender'] ?? json['Member']?['gender'])?.toString(),
handicap: () {
final val = json['handicap'] ?? json['Member']?['handicap'];
if (val == null) return null;
if (val is num) return val.toInt();
return int.tryParse(val.toString());
}(),
average: () {
final val = json['average'] ?? json['Member']?['average'];
if (val == null) return null;
if (val is num) return val.toDouble();
return double.tryParse(val.toString());
}(),
);
// 회원 유형은 원시 enum 값을 유지하고, 표시 단계에서 매핑
final rawType = (json['memberType'] ?? json['Member']?['memberType'])?.toString();
if (rawType != null && rawType.isNotEmpty) {
p.memberType = rawType;
}
return p;
}
// Participant 객체를 JSON으로 변환
@@ -77,8 +148,12 @@ class Participant {
'isPaid': isPaid,
'paidAmount': paidAmount,
'notes': notes,
'comment': notes,
'createdAt': createdAt?.toIso8601String(),
'updatedAt': updatedAt?.toIso8601String(),
'gender': gender,
'handicap': handicap,
'average': average,
};
}
}