Files
vapor-po/Sources/SharedModels/PurchaseOrder.swift

148 lines
3.7 KiB
Swift

import Dependencies
import Foundation
public struct PurchaseOrder: Codable, Equatable, Identifiable, Sendable {
public let id: Int
public var workOrder: Int?
public var materials: String
public var customer: String
public var truckStock: Bool
public var createdBy: User
public var createdFor: Employee
public var vendorBranch: VendorBranch.Detail
public var createdAt: Date?
public var updatedAt: Date?
public init(
id: Int,
workOrder: Int? = nil,
materials: String,
customer: String,
truckStock: Bool,
createdBy: User,
createdFor: Employee,
vendorBranch: VendorBranch.Detail,
createdAt: Date?,
updatedAt: Date?
) {
self.id = id
self.workOrder = workOrder
self.materials = materials
self.customer = customer
self.truckStock = truckStock
self.createdBy = createdBy
self.createdFor = createdFor
self.vendorBranch = vendorBranch
self.createdAt = createdAt
self.updatedAt = updatedAt
}
}
public extension PurchaseOrder {
struct Create: Codable, Sendable, Equatable {
public let id: Int?
public let workOrder: Int?
public let materials: String
public let customer: String
public let truckStock: Bool?
public let createdByID: User.ID
public let createdForID: Employee.ID
public let vendorBranchID: VendorBranch.ID
public init(
id: Int? = nil,
workOrder: Int? = nil,
materials: String,
customer: String,
truckStock: Bool? = nil,
createdByID: User.ID,
createdForID: Employee.ID,
vendorBranchID: VendorBranch.ID
) {
self.id = id
self.workOrder = workOrder
self.materials = materials
self.customer = customer
self.truckStock = truckStock
self.createdByID = createdByID
self.createdForID = createdForID
self.vendorBranchID = vendorBranchID
}
}
struct CreateIntermediate: Codable, Sendable, Equatable {
public let id: Int?
public let workOrder: Int?
public let materials: String
public let customer: String
public let truckStock: Bool?
public let createdForID: Employee.ID
public let vendorBranchID: VendorBranch.ID
public init(
id: Int? = nil,
workOrder: Int? = nil,
materials: String,
customer: String,
truckStock: Bool? = nil,
createdForID: Employee.ID,
vendorBranchID: VendorBranch.ID
) {
self.id = id
self.workOrder = workOrder
self.materials = materials
self.customer = customer
self.truckStock = truckStock
self.createdForID = createdForID
self.vendorBranchID = vendorBranchID
}
public func toCreate(createdByID userID: User.ID) -> PurchaseOrder.Create {
.init(
id: id,
workOrder: workOrder,
materials: materials,
customer: customer,
truckStock: truckStock,
createdByID: userID,
createdForID: createdForID,
vendorBranchID: vendorBranchID
)
}
}
enum SearchContext: Sendable, Equatable {
case customer(String)
case vendor(VendorBranch.ID)
case employee(Employee.ID)
}
}
#if DEBUG
public extension PurchaseOrder.CreateIntermediate {
static func generateMocks(
count: Int = 50,
employees: [Employee],
vendorBranches: [VendorBranch]
) -> [Self] {
precondition(employees.count > 0)
precondition(vendorBranches.count > 0)
return (0 ... count).reduce(into: [Self]()) { array, _ in
array.append(.init(
materials: "Some materials",
customer: "\(RandomNames.firstNames.randomElement()!) \(RandomNames.lastNames.randomElement()!)",
createdForID: employees.randomElement()!.id,
vendorBranchID: vendorBranches.randomElement()!.id
))
}
}
}
#endif