namespace PlanTempus.Application.Features.Employees.Components;
///
/// Shared catalog for employee detail data.
/// Used by all EmployeeDetail* ViewComponents.
///
public static class EmployeeDetailCatalog
{
private static readonly Dictionary Employees = new()
{
["employee-1"] = new EmployeeDetailRecord
{
Key = "employee-1",
Initials = "MJ",
Name = "Maria Jensen",
Email = "maria@salonbeauty.dk",
Phone = "+45 12 34 56 78",
Role = "owner",
RoleKey = "employees.roles.owner",
Status = "active",
StatusKey = "employees.status.active",
BookingsThisYear = "312",
RevenueThisYear = "245.800 kr",
Rating = "4.9",
EmployedSince = "2018",
Address = "Hovedgaden 12",
PostalCity = "2100 København Ø",
EmploymentDate = "1. januar 2018",
Position = "Ejer",
EmploymentType = "Fuldtid",
HoursPerWeek = "37",
BirthDate = "12. maj 1985",
EmergencyContact = "Peter Jensen (ægtefælle)",
EmergencyPhone = "+45 98 76 54 32",
BankAccount = "1234-5678901234",
TaxCard = "Hovedkort",
HourlyRate = "250 kr",
MonthlyFixedSalary = "45.000 kr",
Tags = new() { new("Master Stylist", "master"), new("Farvecertificeret", "cert") }
},
["employee-2"] = new EmployeeDetailRecord
{
Key = "employee-2",
Initials = "AS",
Name = "Anna Sørensen",
Email = "anna@salonbeauty.dk",
Phone = "+45 23 45 67 89",
Role = "admin",
RoleKey = "employees.roles.admin",
Status = "active",
StatusKey = "employees.status.active",
AvatarColor = "purple",
BookingsThisYear = "248",
RevenueThisYear = "186.450 kr",
Rating = "4.9",
EmployedSince = "2019",
Address = "Vestergade 15, 3. tv",
PostalCity = "8000 Aarhus C",
EmploymentDate = "1. august 2019",
Position = "Master Stylist",
EmploymentType = "Fuldtid",
HoursPerWeek = "37",
BirthDate = "15. marts 1992",
EmergencyContact = "Peter Sørensen (ægtefælle)",
EmergencyPhone = "+45 87 65 43 21",
BankAccount = "2345-6789012345",
TaxCard = "Hovedkort",
HourlyRate = "220 kr",
MonthlyFixedSalary = "38.000 kr",
Tags = new() { new("Master Stylist", "master"), new("Farvecertificeret", "cert"), new("Balayage", "cert") }
},
["employee-3"] = new EmployeeDetailRecord
{
Key = "employee-3",
Initials = "LP",
Name = "Louise Pedersen",
Email = "louise@salonbeauty.dk",
Phone = "+45 34 56 78 90",
Role = "leader",
RoleKey = "employees.roles.leader",
Status = "active",
StatusKey = "employees.status.active",
AvatarColor = "blue",
BookingsThisYear = "198",
RevenueThisYear = "156.200 kr",
Rating = "4.7",
EmployedSince = "2020",
Address = "Nørrebrogade 45",
PostalCity = "2200 København N",
EmploymentDate = "15. marts 2020",
Position = "Senior Stylist",
EmploymentType = "Fuldtid",
HoursPerWeek = "37",
BirthDate = "22. november 1988",
EmergencyContact = "Hans Pedersen (far)",
EmergencyPhone = "+45 76 54 32 10",
BankAccount = "3456-7890123456",
TaxCard = "Hovedkort",
HourlyRate = "200 kr",
MonthlyFixedSalary = "35.000 kr",
Tags = new() { new("Senior Stylist", "senior"), new("Farvecertificeret", "cert") }
},
["employee-4"] = new EmployeeDetailRecord
{
Key = "employee-4",
Initials = "KN",
Name = "Katrine Nielsen",
Email = "katrine@salonbeauty.dk",
Phone = "+45 45 67 89 01",
Role = "employee",
RoleKey = "employees.roles.employee",
Status = "active",
StatusKey = "employees.status.active",
AvatarColor = "amber",
BookingsThisYear = "165",
RevenueThisYear = "124.300 kr",
Rating = "4.8",
EmployedSince = "2021",
Address = "Frederiksberggade 28",
PostalCity = "1459 København K",
EmploymentDate = "1. juni 2021",
Position = "Stylist",
EmploymentType = "Fuldtid",
HoursPerWeek = "32",
BirthDate = "8. august 1995",
EmergencyContact = "Mette Nielsen (mor)",
EmergencyPhone = "+45 65 43 21 09",
BankAccount = "4567-8901234567",
TaxCard = "Hovedkort",
HourlyRate = "180 kr",
MonthlyFixedSalary = "32.000 kr",
Tags = new() { new("Stylist", "default") }
},
["employee-5"] = new EmployeeDetailRecord
{
Key = "employee-5",
Initials = "SH",
Name = "Sofie Hansen",
Email = "sofie@salonbeauty.dk",
Phone = "+45 56 78 90 12",
Role = "employee",
RoleKey = "employees.roles.employee",
Status = "invited",
StatusKey = "employees.status.invited",
AvatarColor = "purple",
BookingsThisYear = "0",
RevenueThisYear = "0 kr",
Rating = "-",
EmployedSince = "2025",
Address = "-",
PostalCity = "-",
EmploymentDate = "1. januar 2025",
Position = "Junior Stylist",
EmploymentType = "Fuldtid",
HoursPerWeek = "37",
BirthDate = "-",
EmergencyContact = "-",
EmergencyPhone = "-",
BankAccount = "-",
TaxCard = "-",
HourlyRate = "150 kr",
MonthlyFixedSalary = "28.000 kr",
Tags = new() { new("Junior Stylist", "junior") }
}
};
public static EmployeeDetailRecord Get(string key)
{
if (!Employees.TryGetValue(key, out var employee))
throw new KeyNotFoundException($"Employee with key '{key}' not found");
return employee;
}
public static IEnumerable AllKeys => Employees.Keys;
}
///
/// Complete employee detail record used across all detail ViewComponents.
///
public record EmployeeDetailRecord
{
// Identity
public required string Key { get; init; }
public required string Initials { get; init; }
public required string Name { get; init; }
public string? AvatarColor { get; init; }
// Contact
public required string Email { get; init; }
public required string Phone { get; init; }
public required string Address { get; init; }
public required string PostalCity { get; init; }
// Role & Status
public required string Role { get; init; }
public required string RoleKey { get; init; }
public required string Status { get; init; }
public required string StatusKey { get; init; }
// Stats
public required string BookingsThisYear { get; init; }
public required string RevenueThisYear { get; init; }
public required string Rating { get; init; }
public required string EmployedSince { get; init; }
// Employment
public required string EmploymentDate { get; init; }
public required string Position { get; init; }
public required string EmploymentType { get; init; }
public required string HoursPerWeek { get; init; }
// Personal
public required string BirthDate { get; init; }
public required string EmergencyContact { get; init; }
public required string EmergencyPhone { get; init; }
// Salary
public required string BankAccount { get; init; }
public required string TaxCard { get; init; }
public required string HourlyRate { get; init; }
public required string MonthlyFixedSalary { get; init; }
// Salary - Rates
public string NormalRate { get; init; } = "131,49 kr";
public string OvertimeRate { get; init; } = "280,50 kr";
public string VacationRate { get; init; } = "140,25 kr";
// Salary - Commission
public string MinimumPerHour { get; init; } = "220 kr";
public string ServiceCommission { get; init; } = "15%";
public string ProductCommission { get; init; } = "15%";
// Salary - Supplements
public string WeekdaySupplement { get; init; } = "28,03 kr";
public string SaturdaySupplement { get; init; } = "56,02 kr";
public string SundaySupplement { get; init; } = "112,07 kr";
// Salary - Rate values (numeric only, for drawer inputs)
public string NormalRateValue { get; init; } = "131,49";
public string OvertimeRateValue { get; init; } = "280,50";
public string CourseRateValue { get; init; } = "140,25";
public string TimeOffRateValue { get; init; } = "140,25";
public string PaidLeaveRateValue { get; init; } = "140,25";
public string VacationRateValue { get; init; } = "140,25";
public string OfficeRateValue { get; init; } = "140,25";
public string ChildSickRateValue { get; init; } = "140,25";
public string ChildHospitalRateValue { get; init; } = "140,25";
public string MaternityRateValue { get; init; } = "140,25";
public string WeekdaySupplementValue { get; init; } = "28,03";
public string SaturdaySupplementValue { get; init; } = "56,02";
public string SundaySupplementValue { get; init; } = "112,07";
public string ProductCommissionValue { get; init; } = "15";
public string ServiceCommissionValue { get; init; } = "15";
// HR - Contract
public string ContractType { get; init; } = "Fastansættelse";
public string TerminationNotice { get; init; } = "1 måned";
public string ContractExpiry { get; init; } = "— (ingen udløb)";
// HR - Vacation
public string VacationEarned { get; init; } = "25 dage";
public string VacationUsed { get; init; } = "12 dage";
public string VacationRemaining { get; init; } = "13 dage";
// HR - Absence
public string SickDays2025 { get; init; } = "3 dage";
public string SickDays2024 { get; init; } = "7 dage";
public string ChildSickDays2025 { get; init; } = "1 dag";
public string MaternityLeave { get; init; } = "— (ingen planlagt)";
// Tags (certifications, specialties)
public List Tags { get; init; } = new();
}
public record EmployeeTag(string Text, string CssClass);
// HR data records
public record CertificationRecord(string Name, string ExpiryDate, string Status, string StatusClass);
public record CourseRecord(string Name, string Provider, string Date, string? Status = null);
public record DocumentRecord(string Name, string UploadDate);
public record PlannedAbsenceRecord(string Dates, string Type, string TypeClass);