import Foundation import RealmSwift public enum OwnerType: String, CustomStringConvertible { case legal case individual public var description: String { switch self { case .legal: return NSLocalizedString("legal", comment: "Owner type") case .individual: return NSLocalizedString("individual", comment: "Owner type") } } } public enum SteeringWheelPosition: CustomStringConvertible { case left case right case unknown public var description: String { switch self { case .left: return "Left" case .right: return "Right" case .unknown: return "Unknown" } } } public final class Vehicle: Object, Identifiable { @Persisted public var brand: VehicleBrand? @Persisted public var model: VehicleModel? @Persisted public var color: String? @Persisted public var year: Int = 0 @Persisted public var category: String? @Persisted public var engine: VehicleEngine? @Persisted private var number: String = "" @Persisted public var currentNumber: String? @Persisted public var vin1: String? @Persisted public var vin2: String? @Persisted public var sts: String? @Persisted public var pts: String? @Persisted public var isRightWheel: Bool? @Persisted public var isJapanese: Bool? @Persisted public var addedDate: TimeInterval = 0 @Persisted public var updatedDate: TimeInterval = 0 @Persisted public var addedBy: String = "" @Persisted public var photos: List @Persisted public var ownershipPeriods: List @Persisted public var events: List @Persisted public var osagoContracts: List @Persisted public var ads: List @Persisted public var notes: List @Persisted public var debugInfo: DebugInfo? @Persisted public var synchronized: Bool = true public convenience init(_ number: String) { self.init() self.number = number self.addedDate = Date().timeIntervalSince1970 self.updatedDate = self.addedDate self.synchronized = false } public override static func primaryKey() -> String? { return "number" } public override class func ignoredProperties() -> [String] { return ["id", "identifier", "differenceIdentifier", "formatter"] } } extension Vehicle: DtoConvertible { public var shallowDto: VehicleDto { var vehicle = VehicleDto() vehicle.number = self.number vehicle.currentNumber = self.currentNumber vehicle.addedDate = self.addedDate vehicle.updatedDate = self.updatedDate vehicle.brand = self.brand?.dto vehicle.synchronized = self.synchronized vehicle.notes = Array(notes.map(\.dto)) vehicle.events = Array(events.map(\.dto).sorted { $0.date > $1.date }) return vehicle } public var dto: VehicleDto { var vehicle = VehicleDto() vehicle.brand = brand?.dto vehicle.model = model?.dto vehicle.color = color vehicle.year = year vehicle.category = category vehicle.engine = engine?.dto vehicle.number = number vehicle.currentNumber = currentNumber vehicle.vin1 = vin1 vehicle.vin2 = vin2 vehicle.sts = sts vehicle.pts = pts vehicle.isRightWheel = isRightWheel vehicle.isJapanese = isJapanese vehicle.addedDate = addedDate vehicle.updatedDate = updatedDate vehicle.addedBy = addedBy vehicle.photos = photos.map(\.dto) vehicle.ownershipPeriods = ownershipPeriods.map(\.dto) vehicle.events = events.map(\.dto) vehicle.osagoContracts = osagoContracts.map(\.dto) vehicle.ads = ads.map(\.dto) vehicle.notes = notes.map(\.dto) vehicle.debugInfo = debugInfo?.dto vehicle.synchronized = synchronized return vehicle } public convenience init(dto: VehicleDto) { self.init(dto.number) self.brand = VehicleBrand(dto: dto.brand) self.model = VehicleModel(dto: dto.model) self.color = dto.color self.year = dto.year self.category = dto.category self.engine = VehicleEngine(dto: dto.engine) self.number = dto.number self.currentNumber = dto.currentNumber self.vin1 = dto.vin1 self.vin2 = dto.vin2 self.sts = dto.sts self.pts = dto.pts self.isRightWheel = dto.isRightWheel self.isJapanese = dto.isJapanese self.addedDate = dto.addedDate self.addedBy = dto.addedBy self.updatedDate = dto.updatedDate let photos = List() photos.append(objectsIn: dto.photos.map(VehiclePhoto.init)) self.photos = photos let ownerships = List() ownerships.append(objectsIn: dto.ownershipPeriods.map(VehicleOwnershipPeriod.init)) self.ownershipPeriods = ownerships let events = List() events.append(objectsIn: dto.events.map(VehicleEvent.init).sorted { $0.date > $1.date }) self.events = events let osago = List() osago.append(objectsIn: dto.osagoContracts.map(Osago.init)) self.osagoContracts = osago let ads = List() ads.append(objectsIn: dto.ads.map(VehicleAd.init)) self.ads = ads let notes = List() notes.append(objectsIn: dto.notes.map(VehicleNote.init)) self.notes = notes self.synchronized = dto.synchronized } }