128 lines
3.6 KiB
Dart
128 lines
3.6 KiB
Dart
import 'package:superport/models/company_model.dart';
|
|
|
|
/// Company 엔터티를 기반으로 본사/지점을 통합 관리하는 래퍼 모델
|
|
/// parentCompanyId 기반으로 본사/지점 구분 (Clean Architecture)
|
|
class CompanyItem {
|
|
final Company company; // 본사 또는 지점 (통합)
|
|
final String? parentCompanyName; // 지점인 경우만 본사명 (조회된 데이터)
|
|
|
|
/// 지점 여부 (parentCompanyId != null)
|
|
bool get isBranch => company.parentCompanyId != null;
|
|
|
|
/// 본사 여부 (parentCompanyId == null)
|
|
bool get isHeadquarters => company.parentCompanyId == null;
|
|
|
|
CompanyItem({
|
|
required this.company,
|
|
this.parentCompanyName, // 지점인 경우만 설정
|
|
}) : assert(
|
|
// 지점인 경우 parentCompanyName이 있어야 함
|
|
company.parentCompanyId == null || parentCompanyName != null,
|
|
'Branch must have parentCompanyName'
|
|
);
|
|
|
|
/// 본사 생성자
|
|
CompanyItem.headquarters(this.company)
|
|
: parentCompanyName = null;
|
|
|
|
/// 지점 생성자
|
|
CompanyItem.branch(Company branchCompany, this.parentCompanyName)
|
|
: company = branchCompany;
|
|
|
|
/// 표시용 이름 (계층적 구조)
|
|
String get displayName {
|
|
if (isBranch) {
|
|
return '$parentCompanyName > ${company.name}';
|
|
} else {
|
|
return company.name;
|
|
}
|
|
}
|
|
|
|
/// 실제 이름 (본사명 또는 지점명)
|
|
String get name => company.name;
|
|
|
|
/// ID (본사 ID 또는 지점 ID)
|
|
int? get id => company.id;
|
|
|
|
/// 주소
|
|
String get address => company.address.toString();
|
|
|
|
/// 담당자명
|
|
String? get contactName => company.contactName;
|
|
|
|
/// 담당자 직급
|
|
String? get contactPosition => company.contactPosition;
|
|
|
|
/// 연락처
|
|
String? get contactPhone => company.contactPhone;
|
|
|
|
/// 이메일
|
|
String? get contactEmail => company.contactEmail;
|
|
|
|
/// 회사 유형 (본사만, 지점은 빈 리스트)
|
|
List<CompanyType> get companyTypes {
|
|
return isBranch ? [] : company.companyTypes;
|
|
}
|
|
|
|
/// 비고
|
|
String? get remark => company.remark;
|
|
|
|
/// 생성일
|
|
DateTime? get createdAt => company.createdAt;
|
|
|
|
/// 수정일
|
|
DateTime? get updatedAt => company.updatedAt;
|
|
|
|
/// 활성 상태
|
|
bool get isActive => company.isActive;
|
|
|
|
/// 파트너사 플래그 (지점은 부모 회사의 속성 상속)
|
|
bool get isPartner => isBranch ? false : company.isPartner;
|
|
|
|
/// 고객사 플래그 (지점은 부모 회사의 속성 상속)
|
|
bool get isCustomer => isBranch ? false : company.isCustomer;
|
|
|
|
/// 부모 회사 ID (지점인 경우만)
|
|
int? get parentCompanyId => company.parentCompanyId;
|
|
|
|
/// JSON 직렬화
|
|
Map<String, dynamic> toJson() {
|
|
return {
|
|
'company': company.toJson(),
|
|
'parentCompanyName': parentCompanyName,
|
|
'isBranch': isBranch,
|
|
};
|
|
}
|
|
|
|
/// JSON 역직렬화
|
|
factory CompanyItem.fromJson(Map<String, dynamic> json) {
|
|
final company = Company.fromJson(json['company']);
|
|
final parentCompanyName = json['parentCompanyName'] as String?;
|
|
|
|
if (company.parentCompanyId != null) {
|
|
return CompanyItem.branch(company, parentCompanyName!);
|
|
} else {
|
|
return CompanyItem.headquarters(company);
|
|
}
|
|
}
|
|
|
|
@override
|
|
bool operator ==(Object other) {
|
|
if (identical(this, other)) return true;
|
|
|
|
return other is CompanyItem &&
|
|
other.company.id == company.id;
|
|
}
|
|
|
|
@override
|
|
int get hashCode => company.id.hashCode;
|
|
|
|
@override
|
|
String toString() {
|
|
if (isBranch) {
|
|
return 'CompanyItem.branch(${company.name} of $parentCompanyName)';
|
|
} else {
|
|
return 'CompanyItem.headquarters(${company.name})';
|
|
}
|
|
}
|
|
} |