using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; namespace Lagerbestand.Models; /// /// Condition rating of a single tire as reported by the measurement device. /// public enum TireMeasureRating { Unknown = 0, Ok = 1, Warning = 2, Critical = 3 } /// /// A tread depth / condition measurement for a tire stack, typically imported /// from a Launch TTS01 report (QR code) during checkin. /// public class TireInspection { [Key] public Guid Id { get; set; } = Guid.NewGuid(); public Guid TireStackId { get; set; } [ForeignKey(nameof(TireStackId))] [System.Text.Json.Serialization.JsonIgnore] public TireStack? TireStack { get; set; } [MaxLength(50)] public string Source { get; set; } = "Launch TTS01"; [MaxLength(100)] public string? RecordSn { get; set; } [MaxLength(500)] public string? ReportUrl { get; set; } public DateTime? MeasuredAt { get; set; } [MaxLength(20)] public string? LicensePlate { get; set; } public int? Mileage { get; set; } [Column(TypeName = "decimal(5,2)")] public decimal? TreadDepthFL { get; set; } [Column(TypeName = "decimal(5,2)")] public decimal? TreadDepthFR { get; set; } [Column(TypeName = "decimal(5,2)")] public decimal? TreadDepthRL { get; set; } [Column(TypeName = "decimal(5,2)")] public decimal? TreadDepthRR { get; set; } public TireMeasureRating RatingFL { get; set; } public TireMeasureRating RatingFR { get; set; } public TireMeasureRating RatingRL { get; set; } public TireMeasureRating RatingRR { get; set; } [MaxLength(1000)] public string? Recommendation { get; set; } public string? RawJson { get; set; } public DateTime CreatedAt { get; set; } = DateTime.UtcNow; public Guid? CreatedByUserId { get; set; } [NotMapped] public decimal? MinTreadDepth { get { var values = new[] { TreadDepthFL, TreadDepthFR, TreadDepthRL, TreadDepthRR }.Where(v => v.HasValue).Select(v => v!.Value).ToList(); return values.Count == 0 ? null : values.Min(); } } [NotMapped] public TireMeasureRating WorstRating { get { var ratings = new[] { RatingFL, RatingFR, RatingRL, RatingRR }; return ratings.Max(); } } [NotMapped] public bool HasTreadData => TreadDepthFL.HasValue || TreadDepthFR.HasValue || TreadDepthRL.HasValue || TreadDepthRR.HasValue; /// Legal minimum tread depth in Germany (mm). public const decimal DefaultCriticalThreshold = 1.6m; /// Common workshop recommendation threshold for replacement (mm). public const decimal DefaultWarningThreshold = 3.0m; /// /// Derives a rating from a tread depth in mm. Values below /// are critical, values up to are a warning. /// public static TireMeasureRating RateDepth(decimal? mm, decimal? critical = null, decimal? warning = null) { if (!mm.HasValue) return TireMeasureRating.Unknown; var crit = critical ?? DefaultCriticalThreshold; var warn = Math.Max(warning ?? DefaultWarningThreshold, crit); if (mm.Value < crit) return TireMeasureRating.Critical; if (mm.Value <= warn) return TireMeasureRating.Warning; return TireMeasureRating.Ok; } }