AutoCat/AutoCatCore/Models/SwiftData/SDVehicle.swift

200 lines
5.7 KiB
Swift

//
// SDVehicle.swift
// AutoCatCore
//
// Created by Selim Mustafaev on 10.06.2025.
// Copyright © 2025 Selim Mustafaev. All rights reserved.
//
import Foundation
import SwiftData
@Model
final class SDVehicle {
@Relationship(deleteRule: .cascade)
var brand: SDVehicleBrand?
@Relationship(deleteRule: .cascade)
var model: SDVehicleModel?
var color: String?
var year: Int
var category: String?
@Relationship(deleteRule: .cascade)
var engine: SDVehicleEngine?
@Attribute(.unique)
var number: String
var currentNumber: String?
var vin1: String?
var vin2: String?
var sts: String?
var pts: String?
var isRightWheel: Bool?
var isJapanese: Bool?
var addedDate: TimeInterval
var updatedDate: TimeInterval
var addedBy: String
@Relationship(deleteRule: .cascade)
var photos: [SDVehiclePhoto]
@Relationship(deleteRule: .cascade)
var ownershipPeriods: [SDVehicleOwnershipPeriod]
@Relationship(deleteRule: .cascade)
var events: [SDVehicleEvent]
@Relationship(deleteRule: .cascade)
var osagoContracts: [SDOsago]
@Relationship(deleteRule: .cascade)
var ads: [SDVehicleAd]
@Relationship(deleteRule: .cascade)
var notes: [SDVehicleNote]
@Relationship(deleteRule: .cascade)
var debugInfo: SDDebugInfo?
var synchronized: Bool
init(
brand: SDVehicleBrand? = nil,
model: SDVehicleModel? = nil,
color: String? = nil,
year: Int,
category: String? = nil,
engine: SDVehicleEngine? = nil,
number: String,
currentNumber: String? = nil,
vin1: String? = nil,
vin2: String? = nil,
sts: String? = nil,
pts: String? = nil,
isRightWheel: Bool? = nil,
isJapanese: Bool? = nil,
addedDate: TimeInterval,
updatedDate: TimeInterval,
addedBy: String,
photos: [SDVehiclePhoto],
ownershipPeriods: [SDVehicleOwnershipPeriod],
events: [SDVehicleEvent],
osagoContracts: [SDOsago],
ads: [SDVehicleAd],
notes: [SDVehicleNote],
debugInfo: SDDebugInfo? = nil,
synchronized: Bool
) {
self.brand = brand
self.model = model
self.color = color
self.year = year
self.category = category
self.engine = engine
self.number = number
self.currentNumber = currentNumber
self.vin1 = vin1
self.vin2 = vin2
self.sts = sts
self.pts = pts
self.isRightWheel = isRightWheel
self.isJapanese = isJapanese
self.addedDate = addedDate
self.updatedDate = updatedDate
self.addedBy = addedBy
self.photos = photos
self.ownershipPeriods = ownershipPeriods
self.events = events
self.osagoContracts = osagoContracts
self.ads = ads
self.notes = notes
self.debugInfo = debugInfo
self.synchronized = synchronized
}
}
extension SDVehicle: DtoConvertible {
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 = notes.map(\.dto)
vehicle.events = events.map(\.dto).sorted { $0.date > $1.date }
return vehicle
}
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
}
convenience init(dto: VehicleDto) {
self.init(
brand: SDVehicleBrand(dto: dto.brand),
model: SDVehicleModel(dto: dto.model),
color: dto.color,
year: dto.year,
category: dto.category,
engine: SDVehicleEngine(dto: dto.engine),
number: dto.number,
currentNumber: dto.currentNumber,
vin1: dto.vin1,
vin2: dto.vin2,
sts: dto.sts,
pts: dto.pts,
isRightWheel: dto.isRightWheel,
isJapanese: dto.isJapanese,
addedDate: dto.addedDate,
updatedDate: dto.updatedDate,
addedBy: dto.addedBy,
photos: dto.photos.map(SDVehiclePhoto.init),
ownershipPeriods: dto.ownershipPeriods.map(SDVehicleOwnershipPeriod.init),
events: dto.events.map(SDVehicleEvent.init),
osagoContracts: dto.osagoContracts.map(SDOsago.init),
ads: dto.ads.map(SDVehicleAd.init),
notes: dto.notes.map(SDVehicleNote.init),
debugInfo: SDDebugInfo(dto: dto.debugInfo),
synchronized: dto.synchronized
)
}
}