Add lead workflows, PDF signing, AR projects and photo gallery integration
This commit is contained in:
77
GasTankAR/Domain/Leads/LeadDetail.swift
Normal file
77
GasTankAR/Domain/Leads/LeadDetail.swift
Normal 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
|
||||
}
|
||||
Reference in New Issue
Block a user