using Data.SeaHavenIndustries; namespace SeaHaven.DataServices.Models { public sealed class VendorCompanyRosterReadModel { public int CompanyId { get; set; } public string Name { get; set; } = string.Empty; public string? CompanyPhone { get; set; } public string? Email { get; set; } public string? Address { get; set; } public string? City { get; set; } public string? State { get; set; } public string? Zip { get; set; } public string? GoogleMapsUrl { get; set; } public string? Notes { get; set; } public byte[]? RowVersion { get; set; } public List Technicians { get; set; } = new(); } public sealed class VendorRosterTechnicianReadModel { public int Id { get; set; } public string? ContactName { get; set; } public string? Phone { get; set; } public string? Email { get; set; } public string? PreferredContact { get; set; } public string? TradeSpecialties { get; set; } public bool IsActive { get; set; } public int TotalJobs { get; set; } } public sealed class VendorCompanyRosterWriteModel { public int CompanyId { get; set; } public byte[]? RowVersion { get; set; } public string Name { get; set; } = string.Empty; public string? CompanyPhone { get; set; } public string? Email { get; set; } public string? Address { get; set; } public string? City { get; set; } public string? State { get; set; } public string? Zip { get; set; } public string? GoogleMapsUrl { get; set; } public string? Notes { get; set; } public string? ActorUserId { get; set; } public List Technicians { get; set; } = new(); } public sealed class RosterTechnicianWriteModel { public int? Id { get; set; } public string? ContactName { get; set; } public string? Phone { get; set; } public string? Email { get; set; } public string? PreferredContact { get; set; } public string? TradeSpecialties { get; set; } public bool IsActive { get; set; } = true; } // Raised by the roster data service when a technician removed from the snapshot // still has open linked work orders, so the whole reconcile must fail. Carries the // blocking work orders so the API can surface a stable 409 without leaking internals. public sealed class VendorRosterConflictException : Exception { public IReadOnlyList BlockedWorkOrders { get; } public VendorRosterConflictException(string message, IReadOnlyList blockedWorkOrders) : base(message) { BlockedWorkOrders = blockedWorkOrders; } } }