import 'dart:convert'; import 'package:objectbox/objectbox.dart'; import 'package:stadtbote/model/job_tour.dart'; import 'package:stadtbote/model/tour_file.dart'; @Entity() class Job { @Id() int id = 0; // External ID from server @Unique() late int externalId; late String ver; late int state; String? crFilter; late int ordertime; late int offsWarn; late bool global; late int vhtId; late String rem; late int delayOrderTime; // Store tours as JSON string for ObjectBox String toursJson = '[]'; @Transient() List get tours { final List decoded = jsonDecode(toursJson); return decoded.map((e) => JobTour.fromJson(e as Map)).toList(); } set tours(List value) { toursJson = jsonEncode(value.map((e) => e.toJson()).toList()); } // Store files as JSON string for ObjectBox String filesJson = ''; @Transient() List get files { if (filesJson.isEmpty) { return []; } final List decoded = jsonDecode(filesJson); return decoded.map((e) => TourFile.fromJson(e as Map)).toList(); } set files(List value) { filesJson = jsonEncode(value.map((e) => e.toJson()).toList()); } // Helper method to check if job has files bool get hasFiles => files.isNotEmpty; Job(); factory Job.fromJson(Map json) { final job = Job(); job.id = 0; // Let ObjectBox assign the ID job.externalId = json['id'] as int; // Store external ID separately job.ver = json['ver'] as String; job.state = json['state'] as int; job.crFilter = json['cr_filter'] as String?; job.ordertime = json['ordertime'] as int; job.offsWarn = json['offs_warn'] as int; job.global = json['global'] as bool; job.vhtId = json['vht_id'] as int; job.rem = json['rem'] as String; job.delayOrderTime = json['delayOrderTime'] as int; job.tours = (json['tours'] as List) .map((e) => JobTour.fromJson(e as Map)) .toList(); if (json['files'] != null) { job.files = (json['files'] as List) .map((e) => TourFile.fromJson(e as Map)) .toList(); } return job; } Map toJson() { return { 'id': externalId, // Use external ID for JSON 'ver': ver, 'state': state, 'cr_filter': crFilter, 'ordertime': ordertime, 'offs_warn': offsWarn, 'global': global, 'vht_id': vhtId, 'rem': rem, 'delayOrderTime': delayOrderTime, 'tours': tours.map((e) => e.toJson()).toList(), 'files': files.map((e) => e.toJson()).toList(), }; } }