/// 사용자(User) 도메인 엔티티. class UserAccount { UserAccount({ this.id, required this.employeeNo, required this.employeeName, this.email, this.mobileNo, this.group, this.isActive = true, this.isDeleted = false, this.note, this.forcePasswordChange = false, this.passwordUpdatedAt, this.createdAt, this.updatedAt, }); final int? id; final String employeeNo; final String employeeName; final String? email; final String? mobileNo; final UserGroup? group; final bool isActive; final bool isDeleted; final String? note; final bool forcePasswordChange; final DateTime? passwordUpdatedAt; final DateTime? createdAt; final DateTime? updatedAt; /// 선택된 속성만 변경한 새 인스턴스를 반환한다. UserAccount copyWith({ int? id, String? employeeNo, String? employeeName, String? email, String? mobileNo, UserGroup? group, bool? isActive, bool? isDeleted, String? note, bool? forcePasswordChange, DateTime? passwordUpdatedAt, DateTime? createdAt, DateTime? updatedAt, }) { return UserAccount( id: id ?? this.id, employeeNo: employeeNo ?? this.employeeNo, employeeName: employeeName ?? this.employeeName, email: email ?? this.email, mobileNo: mobileNo ?? this.mobileNo, group: group ?? this.group, isActive: isActive ?? this.isActive, isDeleted: isDeleted ?? this.isDeleted, note: note ?? this.note, forcePasswordChange: forcePasswordChange ?? this.forcePasswordChange, passwordUpdatedAt: passwordUpdatedAt ?? this.passwordUpdatedAt, createdAt: createdAt ?? this.createdAt, updatedAt: updatedAt ?? this.updatedAt, ); } } /// 사용자에 연결된 그룹 정보. class UserGroup { UserGroup({required this.id, required this.groupName}); final int id; final String groupName; } /// 사용자 생성/수정 입력 모델. class UserInput { UserInput({ required this.employeeNo, required this.employeeName, required this.groupId, this.email, this.mobileNo, this.isActive = true, this.forcePasswordChange, this.password, this.note, }); final String employeeNo; final String employeeName; final int groupId; final String? email; final String? mobileNo; final bool isActive; final bool? forcePasswordChange; final String? password; final String? note; /// API 요청 바디로 직렬화한다. Map toPayload() { return { 'employee_id': employeeNo, 'name': employeeName, 'group_id': groupId, if (email != null) 'email': email, if (mobileNo != null) 'phone': mobileNo, 'is_active': isActive, if (forcePasswordChange != null) 'force_password_change': forcePasswordChange, if (password != null) 'password': password, if (note != null) 'note': note, }; } } /// 자기 정보 수정 입력 모델. class UserProfileUpdateInput { const UserProfileUpdateInput({ this.email, this.phone, this.password, this.currentPassword, }); final String? email; final String? phone; final String? password; final String? currentPassword; /// 자기 정보 수정 요청 바디를 직렬화한다. Map toPayload() { return { if (email != null) 'email': email, if (phone != null) 'phone': phone, if (password != null) 'password': password, if (currentPassword != null) 'current_password': currentPassword, }; } }