feat: 대시보드에 라이선스 만료 요약 및 Lookup 데이터 캐싱 시스템 구현
Some checks failed
Flutter Test & Quality Check / Test on macos-latest (push) Has been cancelled
Flutter Test & Quality Check / Test on ubuntu-latest (push) Has been cancelled
Flutter Test & Quality Check / Build APK (push) Has been cancelled

- License Expiry Summary API 연동 완료
  - 30/60/90일 내 만료 예정 라이선스 요약 표시
  - 대시보드 상단에 알림 카드로 통합
  - 만료 임박 순서로 색상 구분 (빨강/주황/노랑)

- Lookup 데이터 전역 캐싱 시스템 구축
  - LookupService 및 RemoteDataSource 생성
  - 전체 lookup 데이터 일괄 로드 및 캐싱
  - 타입별 필터링 지원

- 새로운 모델 추가
  - LicenseExpirySummary (Freezed)
  - LookupData, LookupCategory, LookupItem 모델

- CLAUDE.md 문서 업데이트
  - 미사용 API 활용 계획 추가
  - 구현 우선순위 정의

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
JiWoong Sul
2025-08-08 14:42:20 +09:00
parent 740a691406
commit 844c7bd92f
15 changed files with 2105 additions and 4 deletions

View File

@@ -0,0 +1,63 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'lookup_data.dart';
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
_$LookupDataImpl _$$LookupDataImplFromJson(Map<String, dynamic> json) =>
_$LookupDataImpl(
equipmentTypes: (json['equipment_types'] as List<dynamic>)
.map((e) => LookupItem.fromJson(e as Map<String, dynamic>))
.toList(),
equipmentStatuses: (json['equipment_statuses'] as List<dynamic>)
.map((e) => LookupItem.fromJson(e as Map<String, dynamic>))
.toList(),
licenseTypes: (json['license_types'] as List<dynamic>)
.map((e) => LookupItem.fromJson(e as Map<String, dynamic>))
.toList(),
manufacturers: (json['manufacturers'] as List<dynamic>)
.map((e) => LookupItem.fromJson(e as Map<String, dynamic>))
.toList(),
userRoles: (json['user_roles'] as List<dynamic>)
.map((e) => LookupItem.fromJson(e as Map<String, dynamic>))
.toList(),
companyStatuses: (json['company_statuses'] as List<dynamic>)
.map((e) => LookupItem.fromJson(e as Map<String, dynamic>))
.toList(),
warehouseTypes: (json['warehouse_types'] as List<dynamic>)
.map((e) => LookupItem.fromJson(e as Map<String, dynamic>))
.toList(),
);
Map<String, dynamic> _$$LookupDataImplToJson(_$LookupDataImpl instance) =>
<String, dynamic>{
'equipment_types': instance.equipmentTypes,
'equipment_statuses': instance.equipmentStatuses,
'license_types': instance.licenseTypes,
'manufacturers': instance.manufacturers,
'user_roles': instance.userRoles,
'company_statuses': instance.companyStatuses,
'warehouse_types': instance.warehouseTypes,
};
_$LookupItemImpl _$$LookupItemImplFromJson(Map<String, dynamic> json) =>
_$LookupItemImpl(
code: json['code'] as String,
name: json['name'] as String,
description: json['description'] as String?,
displayOrder: (json['display_order'] as num?)?.toInt(),
isActive: json['is_active'] as bool? ?? true,
metadata: json['metadata'] as Map<String, dynamic>?,
);
Map<String, dynamic> _$$LookupItemImplToJson(_$LookupItemImpl instance) =>
<String, dynamic>{
'code': instance.code,
'name': instance.name,
'description': instance.description,
'display_order': instance.displayOrder,
'is_active': instance.isActive,
'metadata': instance.metadata,
};