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,61 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'license_expiry_summary.dart';
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
_$LicenseExpirySummaryImpl _$$LicenseExpirySummaryImplFromJson(
Map<String, dynamic> json) =>
_$LicenseExpirySummaryImpl(
within30Days: (json['within_30_days'] as num).toInt(),
within60Days: (json['within_60_days'] as num).toInt(),
within90Days: (json['within_90_days'] as num).toInt(),
expired: (json['expired'] as num).toInt(),
totalActive: (json['total_active'] as num).toInt(),
licenses: (json['licenses'] as List<dynamic>)
.map((e) => LicenseExpiryDetail.fromJson(e as Map<String, dynamic>))
.toList(),
);
Map<String, dynamic> _$$LicenseExpirySummaryImplToJson(
_$LicenseExpirySummaryImpl instance) =>
<String, dynamic>{
'within_30_days': instance.within30Days,
'within_60_days': instance.within60Days,
'within_90_days': instance.within90Days,
'expired': instance.expired,
'total_active': instance.totalActive,
'licenses': instance.licenses,
};
_$LicenseExpiryDetailImpl _$$LicenseExpiryDetailImplFromJson(
Map<String, dynamic> json) =>
_$LicenseExpiryDetailImpl(
id: (json['id'] as num).toInt(),
equipmentId: (json['equipment_id'] as num).toInt(),
equipmentName: json['equipment_name'] as String,
serialNumber: json['serial_number'] as String,
companyName: json['company_name'] as String,
licenseType: json['license_type'] as String,
startDate: json['start_date'] as String,
endDate: json['end_date'] as String,
daysRemaining: (json['days_remaining'] as num).toInt(),
isExpired: json['is_expired'] as bool,
);
Map<String, dynamic> _$$LicenseExpiryDetailImplToJson(
_$LicenseExpiryDetailImpl instance) =>
<String, dynamic>{
'id': instance.id,
'equipment_id': instance.equipmentId,
'equipment_name': instance.equipmentName,
'serial_number': instance.serialNumber,
'company_name': instance.companyName,
'license_type': instance.licenseType,
'start_date': instance.startDate,
'end_date': instance.endDate,
'days_remaining': instance.daysRemaining,
'is_expired': instance.isExpired,
};