class ContractSuccessor { final int id; final String title; const ContractSuccessor({required this.id, required this.title}); factory ContractSuccessor.fromJson(Map j) => ContractSuccessor(id: j['id'], title: j['title'] ?? ''); } class Contract { final int id; final String title; final int? companyId; final int? vendorId; final String? companyName; final String? vendorName; final List predecessors; final List successors; final DateTime? periodStart; final DateTime? periodEnd; final String? body; final String? filePath; final int? createdBy; final DateTime createdAt; const Contract({ required this.id, required this.title, this.companyId, this.vendorId, this.companyName, this.vendorName, this.predecessors = const [], this.successors = const [], this.periodStart, this.periodEnd, this.body, this.filePath, this.createdBy, required this.createdAt, }); factory Contract.fromJson(Map j) => Contract( id: j['id'], title: j['title'] ?? '', companyId: j['company_id'], vendorId: j['vendor_id'], companyName: j['company_name'], vendorName: j['vendor_name'], predecessors: (j['predecessors'] as List? ?? []) .map((e) => ContractSuccessor.fromJson(e)) .toList(), successors: (j['successors'] as List? ?? []) .map((e) => ContractSuccessor.fromJson(e)) .toList(), periodStart: j['period_start'] != null ? DateTime.tryParse(j['period_start']) : null, periodEnd: j['period_end'] != null ? DateTime.tryParse(j['period_end']) : null, body: j['body'], filePath: j['file_path'], createdBy: j['created_by'], createdAt: DateTime.parse(j['created_at']), ); String get status { if (successors.isNotEmpty) return 'Replaced'; final today = DateTime.now(); if (periodEnd != null && periodEnd!.isBefore(today)) return 'Expired'; if (periodStart != null && periodStart!.isAfter(today)) return 'Upcoming'; return 'Active'; } bool get isExpiringSoon { if (periodEnd == null) return false; final diff = periodEnd!.difference(DateTime.now()).inDays; return diff >= 0 && diff <= 90; } int? get daysUntilExpiry { if (periodEnd == null) return null; return periodEnd!.difference(DateTime.now()).inDays; } } class ContractAnalysis { final String title; final String summary; final String? periodStart; final String? periodEnd; const ContractAnalysis({ required this.title, required this.summary, this.periodStart, this.periodEnd, }); factory ContractAnalysis.fromJson(Map j) => ContractAnalysis( title: j['title'] ?? '', summary: j['summary'] ?? '', periodStart: j['period_start'], periodEnd: j['period_end'], ); } class PagedContracts { final List items; final int total; final int page; final int limit; const PagedContracts({required this.items, required this.total, required this.page, required this.limit}); factory PagedContracts.fromJson(Map j) => PagedContracts( items: (j['items'] as List).map((e) => Contract.fromJson(e)).toList(), total: j['total'], page: j['page'], limit: j['limit'], ); }