- 라이선스 모델 전면 개편 (상세 필드 추가, 계산 필드 구현) - API 응답 처리 개선 (HTTP 상태 코드 기반) - 장비 출고 폼 컨트롤러 추가 - 회사 지점 정보 모델 추가 - 공통 데이터 모델 구조 추가 - 전체 서비스 레이어 API 호출 방식 통일 - UI 컴포넌트 마이너 개선
162 lines
4.9 KiB
Dart
162 lines
4.9 KiB
Dart
class License {
|
|
final int? id;
|
|
final String licenseKey;
|
|
final String? productName;
|
|
final String? vendor;
|
|
final String? licenseType;
|
|
final int? userCount;
|
|
final DateTime? purchaseDate;
|
|
final DateTime? expiryDate;
|
|
final double? purchasePrice;
|
|
final int? companyId;
|
|
final int? branchId;
|
|
final int? assignedUserId;
|
|
final String? remark;
|
|
final bool isActive;
|
|
final DateTime? createdAt;
|
|
final DateTime? updatedAt;
|
|
|
|
// 조인된 데이터 필드
|
|
final String? companyName;
|
|
final String? branchName;
|
|
final String? assignedUserName;
|
|
|
|
// 계산 필드
|
|
int? get daysUntilExpiry {
|
|
if (expiryDate == null) return null;
|
|
return expiryDate!.difference(DateTime.now()).inDays;
|
|
}
|
|
|
|
bool get isExpired {
|
|
if (expiryDate == null) return false;
|
|
return expiryDate!.isBefore(DateTime.now());
|
|
}
|
|
|
|
String get status {
|
|
if (!isActive) return 'inactive';
|
|
if (isExpired) return 'expired';
|
|
if (daysUntilExpiry != null && daysUntilExpiry! <= 30) return 'expiring';
|
|
return 'active';
|
|
}
|
|
|
|
License({
|
|
this.id,
|
|
required this.licenseKey,
|
|
this.productName,
|
|
this.vendor,
|
|
this.licenseType,
|
|
this.userCount,
|
|
this.purchaseDate,
|
|
this.expiryDate,
|
|
this.purchasePrice,
|
|
this.companyId,
|
|
this.branchId,
|
|
this.assignedUserId,
|
|
this.remark,
|
|
this.isActive = true,
|
|
this.createdAt,
|
|
this.updatedAt,
|
|
this.companyName,
|
|
this.branchName,
|
|
this.assignedUserName,
|
|
});
|
|
|
|
Map<String, dynamic> toJson() {
|
|
return {
|
|
'id': id,
|
|
'license_key': licenseKey,
|
|
'product_name': productName,
|
|
'vendor': vendor,
|
|
'license_type': licenseType,
|
|
'user_count': userCount,
|
|
'purchase_date': purchaseDate?.toIso8601String(),
|
|
'expiry_date': expiryDate?.toIso8601String(),
|
|
'purchase_price': purchasePrice,
|
|
'company_id': companyId,
|
|
'branch_id': branchId,
|
|
'assigned_user_id': assignedUserId,
|
|
'remark': remark,
|
|
'is_active': isActive,
|
|
'created_at': createdAt?.toIso8601String(),
|
|
'updated_at': updatedAt?.toIso8601String(),
|
|
};
|
|
}
|
|
|
|
factory License.fromJson(Map<String, dynamic> json) {
|
|
return License(
|
|
id: json['id'] as int?,
|
|
licenseKey: json['license_key'] as String,
|
|
productName: json['product_name'] as String?,
|
|
vendor: json['vendor'] as String?,
|
|
licenseType: json['license_type'] as String?,
|
|
userCount: json['user_count'] as int?,
|
|
purchaseDate: json['purchase_date'] != null
|
|
? DateTime.parse(json['purchase_date'] as String) : null,
|
|
expiryDate: json['expiry_date'] != null
|
|
? DateTime.parse(json['expiry_date'] as String) : null,
|
|
purchasePrice: (json['purchase_price'] as num?)?.toDouble(),
|
|
companyId: json['company_id'] as int?,
|
|
branchId: json['branch_id'] as int?,
|
|
assignedUserId: json['assigned_user_id'] as int?,
|
|
remark: json['remark'] as String?,
|
|
isActive: json['is_active'] ?? true,
|
|
createdAt: json['created_at'] != null
|
|
? DateTime.parse(json['created_at'] as String) : null,
|
|
updatedAt: json['updated_at'] != null
|
|
? DateTime.parse(json['updated_at'] as String) : null,
|
|
companyName: json['company_name'] as String?,
|
|
branchName: json['branch_name'] as String?,
|
|
assignedUserName: json['assigned_user_name'] as String?,
|
|
);
|
|
}
|
|
|
|
License copyWith({
|
|
int? id,
|
|
String? licenseKey,
|
|
String? productName,
|
|
String? vendor,
|
|
String? licenseType,
|
|
int? userCount,
|
|
DateTime? purchaseDate,
|
|
DateTime? expiryDate,
|
|
double? purchasePrice,
|
|
int? companyId,
|
|
int? branchId,
|
|
int? assignedUserId,
|
|
String? remark,
|
|
bool? isActive,
|
|
DateTime? createdAt,
|
|
DateTime? updatedAt,
|
|
String? companyName,
|
|
String? branchName,
|
|
String? assignedUserName,
|
|
}) {
|
|
return License(
|
|
id: id ?? this.id,
|
|
licenseKey: licenseKey ?? this.licenseKey,
|
|
productName: productName ?? this.productName,
|
|
vendor: vendor ?? this.vendor,
|
|
licenseType: licenseType ?? this.licenseType,
|
|
userCount: userCount ?? this.userCount,
|
|
purchaseDate: purchaseDate ?? this.purchaseDate,
|
|
expiryDate: expiryDate ?? this.expiryDate,
|
|
purchasePrice: purchasePrice ?? this.purchasePrice,
|
|
companyId: companyId ?? this.companyId,
|
|
branchId: branchId ?? this.branchId,
|
|
assignedUserId: assignedUserId ?? this.assignedUserId,
|
|
remark: remark ?? this.remark,
|
|
isActive: isActive ?? this.isActive,
|
|
createdAt: createdAt ?? this.createdAt,
|
|
updatedAt: updatedAt ?? this.updatedAt,
|
|
companyName: companyName ?? this.companyName,
|
|
branchName: branchName ?? this.branchName,
|
|
assignedUserName: assignedUserName ?? this.assignedUserName,
|
|
);
|
|
}
|
|
|
|
// Mock 데이터 호환을 위한 추가 getter (기존 코드 호환)
|
|
String get name => productName ?? licenseKey;
|
|
int get durationMonths => 12; // 기본값
|
|
String get visitCycle => '월'; // 기본값
|
|
}
|