Add lead workflows, PDF signing, AR projects and photo gallery integration

This commit is contained in:
Dennis Nemec
2026-11-08 17:49:39 +01:00
parent a343bde741
commit 8d18873412
82 changed files with 6401 additions and 34 deletions

View File

@ -0,0 +1,77 @@
import Foundation
struct LeadDetail: Equatable, Sendable {
let lead: Lead
let customerType: String
let contactName: String?
let contactRole: String?
let mobile: String?
let email: String?
let tankOptions: [LeadTankOption]
var offers: [LeadOffer]
let photos: [LeadPhoto]
}
struct LeadTankOption: Identifiable, Equatable, Sendable {
let id: String
let title: String
let tank: Tank
}
struct LeadOffer: Identifiable, Equatable, Sendable {
let id: String
let title: String
let kind: LeadOfferKind
let amount: Decimal
let billing: LeadBilling
let validUntil: Date?
let acceptedAt: Date?
var groups: [LeadDocumentGroup]
var tank: Tank? = nil
var documents: [LeadDocument] { groups.flatMap(\.documents) }
var signedCount: Int { documents.filter { $0.status == .signed }.count }
var isComplete: Bool { !documents.isEmpty && signedCount == documents.count }
}
enum LeadOfferKind: String, Sendable { case purchase, rental, service }
enum LeadBilling: String, Sendable { case once, monthly, annually }
struct LeadDocumentGroup: Identifiable, Equatable, Sendable {
let id: String
let title: String
var documents: [LeadDocument]
var signedCount: Int { documents.filter { $0.status == .signed }.count }
var isComplete: Bool { !documents.isEmpty && signedCount == documents.count }
}
struct LeadDocument: Identifiable, Equatable, Sendable {
let id: String
let title: String
let pageCount: Int
var status: LeadSignatureStatus
let file: LeadFileReference
var signaturePlacement: PDFSignaturePlacement? = nil
}
enum LeadSignatureStatus: String, Sendable { case pending, signed }
struct LeadPhoto: Identifiable, Equatable, Sendable {
let id: String
let title: String
let isAR: Bool
let thumbnail: LeadFileReference
let original: LeadFileReference
}
struct LeadFileReference: Hashable, Sendable {
let id: String
let version: String
let kind: LeadFileKind
}
enum LeadFileKind: String, Sendable { case pdf, image }
enum LeadFileError: Error, Equatable {
case notFound, invalidFile, storageUnavailable
}