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,38 @@
import 'package:freezed_annotation/freezed_annotation.dart';
part 'license_expiry_summary.freezed.dart';
part 'license_expiry_summary.g.dart';
@freezed
class LicenseExpirySummary with _$LicenseExpirySummary {
const factory LicenseExpirySummary({
@JsonKey(name: 'within_30_days') required int within30Days,
@JsonKey(name: 'within_60_days') required int within60Days,
@JsonKey(name: 'within_90_days') required int within90Days,
@JsonKey(name: 'expired') required int expired,
@JsonKey(name: 'total_active') required int totalActive,
@JsonKey(name: 'licenses') required List<LicenseExpiryDetail> licenses,
}) = _LicenseExpirySummary;
factory LicenseExpirySummary.fromJson(Map<String, dynamic> json) =>
_$LicenseExpirySummaryFromJson(json);
}
@freezed
class LicenseExpiryDetail with _$LicenseExpiryDetail {
const factory LicenseExpiryDetail({
required int id,
@JsonKey(name: 'equipment_id') required int equipmentId,
@JsonKey(name: 'equipment_name') required String equipmentName,
@JsonKey(name: 'serial_number') required String serialNumber,
@JsonKey(name: 'company_name') required String companyName,
@JsonKey(name: 'license_type') required String licenseType,
@JsonKey(name: 'start_date') required String startDate,
@JsonKey(name: 'end_date') required String endDate,
@JsonKey(name: 'days_remaining') required int daysRemaining,
@JsonKey(name: 'is_expired') required bool isExpired,
}) = _LicenseExpiryDetail;
factory LicenseExpiryDetail.fromJson(Map<String, dynamic> json) =>
_$LicenseExpiryDetailFromJson(json);
}