using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; namespace JobsMedical.Web.Models; /// /// «آماده به کار» — a healthcare worker advertising *themselves* as available for work /// (the supply side), as opposed to a / posted by a /// facility (the demand side). Very common in Iranian medical channels ("پرستار آماده همکاری…"). /// There is no facility; the valuable field is the contact . /// public class TalentListing { public int Id { get; set; } public int RoleId { get; set; } public Role Role { get; set; } = null!; [MaxLength(150)] public string? PersonName { get; set; } // «دکتر سپیده علیزاده» (best-effort) public int? YearsExperience { get; set; } // سابقه (سال) public bool IsLicensed { get; set; } // پروانه‌دار / دارای پروانه public int CityId { get; set; } public City City { get; set; } = null!; public int? DistrictId { get; set; } public District? District { get; set; } [MaxLength(150)] public string? AreaNote { get; set; } // «فقط منطقه ۱» وقتی محله دقیق نگاشت نشد /// Searchable keyword tags (space-separated): certs/skills (mmt, icu…), پروانه‌دار, /// role, city. Drives deep search + tag chips. [MaxLength(500)] public string? Tags { get; set; } public EmploymentType? Availability { get; set; } // تمام‌وقت/پاره‌وقت/قراردادی... public Gender Gender { get; set; } = Gender.Any; // جنسیت فرد // Expected compensation — reuses the shift/job comp model. public PayType PayType { get; set; } = PayType.Negotiable; public long? PayAmount { get; set; } // مبلغ مدنظر (تومان) public int? SharePercent { get; set; } // درصد/سهم درآمد مدنظر («۵۰٪ تسویه») [MaxLength(30)] public string? Phone { get; set; } // primary phone (kept for cards/back-compat) /// All contact channels (phones, email, Instagram, Telegram, Bale, website…). public ICollection Contacts { get; set; } = new List(); [MaxLength(2000)] public string? Description { get; set; } public ShiftStatus Status { get; set; } = ShiftStatus.Open; public ShiftSource Source { get; set; } = ShiftSource.Admin; [MaxLength(500)] public string? SourceUrl { get; set; } // APPROXIMATE coords from the source ad (Divar) — an applicant has no facility, so this is the // only location we have. Shown as a «محدودهٔ تقریبی» circle (the area they're available in). public double? Lat { get; set; } public double? Lng { get; set; } public DateTime CreatedAt { get; set; } = DateTime.UtcNow; // Transient: distance (km) when "near me" is active. Not persisted. [NotMapped] public double? DistanceKm { get; set; } }