Files
tdc114plus/app/lib/src/features/directory/domain/employee.dart
T

240 lines
6.2 KiB
Dart

class Employee {
const Employee({
required this.id,
required this.name,
required this.phoneNumber,
this.phoneDisplay,
this.email,
required this.tenantId,
required this.tenantName,
required this.tenantSlug,
this.department,
this.grade,
this.position,
this.jobTitle,
this.status,
this.profileImageUrl,
this.sortOrder,
this.isManager = false,
});
final String id;
final String name;
final String phoneNumber;
final String? phoneDisplay;
final String? email;
final String tenantId;
final String tenantName;
final String tenantSlug;
final String? department;
final String? grade;
final String? position;
final String? jobTitle;
final String? status;
final String? profileImageUrl;
final int? sortOrder;
final bool isManager;
factory Employee.fromJson(Map<String, dynamic> json) {
return Employee(
id: json['id'] as String? ?? '',
name: json['name'] as String? ?? '',
phoneNumber: json['phoneNumber'] as String? ?? '',
phoneDisplay: json['phoneDisplay'] as String?,
email: json['email'] as String?,
tenantId: json['tenantId'] as String? ?? '',
tenantName: json['tenantName'] as String? ?? '',
tenantSlug: json['tenantSlug'] as String? ?? '',
department: json['department'] as String?,
grade: json['grade'] as String?,
position: json['position'] as String?,
jobTitle: json['jobTitle'] as String?,
status: json['status'] as String?,
profileImageUrl: json['profileImageUrl'] as String?,
sortOrder: json['sortOrder'] as int?,
isManager: json['isManager'] as bool? ?? false,
);
}
Map<String, dynamic> toJson() {
return {
'id': id,
'name': name,
'phoneNumber': phoneNumber,
'phoneDisplay': phoneDisplay,
'email': email,
'tenantId': tenantId,
'tenantName': tenantName,
'tenantSlug': tenantSlug,
'department': department,
'grade': grade,
'position': position,
'jobTitle': jobTitle,
'status': status,
'profileImageUrl': profileImageUrl,
'sortOrder': sortOrder,
'isManager': isManager,
};
}
}
class TenantRef {
const TenantRef({
required this.id,
required this.name,
required this.slug,
required this.type,
this.parentId,
});
final String id;
final String name;
final String slug;
final String type;
final String? parentId;
factory TenantRef.fromJson(Map<String, dynamic> json) {
return TenantRef(
id: json['id'] as String? ?? '',
name: json['name'] as String? ?? '',
slug: json['slug'] as String? ?? '',
type: json['type'] as String? ?? '',
parentId: json['parentId'] as String?,
);
}
Map<String, dynamic> toJson() {
return {
'id': id,
'name': name,
'slug': slug,
'type': type,
'parentId': parentId,
};
}
}
class EmployeeActions {
const EmployeeActions({
required this.call,
required this.sms,
required this.email,
});
final bool call;
final bool sms;
final bool email;
factory EmployeeActions.fromJson(Map<String, dynamic> json) {
return EmployeeActions(
call: json['call'] as bool? ?? false,
sms: json['sms'] as bool? ?? false,
email: json['email'] as bool? ?? false,
);
}
Map<String, dynamic> toJson() {
return {'call': call, 'sms': sms, 'email': email};
}
}
class EmployeeDetail extends Employee {
const EmployeeDetail({
required super.id,
required super.name,
required super.phoneNumber,
super.phoneDisplay,
super.email,
required super.tenantId,
required super.tenantName,
required super.tenantSlug,
super.department,
super.grade,
super.position,
super.jobTitle,
super.status,
super.profileImageUrl,
super.sortOrder,
super.isManager,
required this.joinedTenants,
required this.actions,
});
final List<TenantRef> joinedTenants;
final EmployeeActions actions;
factory EmployeeDetail.fromJson(Map<String, dynamic> json) {
return EmployeeDetail(
id: json['id'] as String? ?? '',
name: json['name'] as String? ?? '',
phoneNumber: json['phoneNumber'] as String? ?? '',
phoneDisplay: json['phoneDisplay'] as String?,
email: json['email'] as String?,
tenantId: json['tenantId'] as String? ?? '',
tenantName: json['tenantName'] as String? ?? '',
tenantSlug: json['tenantSlug'] as String? ?? '',
department: json['department'] as String?,
grade: json['grade'] as String?,
position: json['position'] as String?,
jobTitle: json['jobTitle'] as String?,
status: json['status'] as String?,
profileImageUrl: json['profileImageUrl'] as String?,
sortOrder: json['sortOrder'] as int?,
isManager: json['isManager'] as bool? ?? false,
joinedTenants: (json['joinedTenants'] as List<dynamic>? ?? [])
.map((item) => TenantRef.fromJson(item as Map<String, dynamic>))
.toList(),
actions: EmployeeActions.fromJson(
json['actions'] as Map<String, dynamic>? ?? {},
),
);
}
@override
Map<String, dynamic> toJson() {
return {
...super.toJson(),
'joinedTenants': joinedTenants.map((tenant) => tenant.toJson()).toList(),
'actions': actions.toJson(),
};
}
}
class EmployeeListResponse {
const EmployeeListResponse({
required this.items,
required this.limit,
required this.offset,
required this.total,
required this.nextCursor,
});
final List<Employee> items;
final int limit;
final int offset;
final int total;
final String nextCursor;
factory EmployeeListResponse.fromJson(Map<String, dynamic> json) {
return EmployeeListResponse(
items: (json['items'] as List<dynamic>? ?? [])
.map((item) => Employee.fromJson(item as Map<String, dynamic>))
.toList(),
limit: json['limit'] as int? ?? 0,
offset: json['offset'] as int? ?? 0,
total: json['total'] as int? ?? 0,
nextCursor: json['nextCursor'] as String? ?? '',
);
}
Map<String, dynamic> toJson() {
return {
'items': items.map((employee) => employee.toJson()).toList(),
'limit': limit,
'offset': offset,
'total': total,
'nextCursor': nextCursor,
};
}
}