172 lines
6.8 KiB
C#
172 lines
6.8 KiB
C#
|
|
namespace PlanTempus.Application.Features.Services.Components;
|
||
|
|
|
||
|
|
/// <summary>
|
||
|
|
/// Shared catalog for service detail data.
|
||
|
|
/// Used by all ServiceDetail* ViewComponents.
|
||
|
|
/// </summary>
|
||
|
|
public static class ServiceDetailCatalog
|
||
|
|
{
|
||
|
|
private static readonly Dictionary<string, ServiceDetailRecord> Services = new()
|
||
|
|
{
|
||
|
|
["service-1"] = new ServiceDetailRecord
|
||
|
|
{
|
||
|
|
Key = "service-1",
|
||
|
|
Name = "Klip & Farve",
|
||
|
|
Category = "Kombi-behandlinger",
|
||
|
|
CalendarColor = "deep-orange",
|
||
|
|
IsActive = true,
|
||
|
|
DurationRange = "60-120",
|
||
|
|
FromPrice = "795 kr",
|
||
|
|
EmployeeCount = "4",
|
||
|
|
BookingsThisYear = "156",
|
||
|
|
Tags = new() { new("Populær", "popular"), new("Kombi", "combo"), new("Farve", "color") },
|
||
|
|
InternalNotes = "Komplet farvebehandling med klip. Husk konsultation ved første besøg. Anbefal Olaplex til kemisk behandlet hår.",
|
||
|
|
CanBookAsMain = true,
|
||
|
|
CanBookAsAddon = false,
|
||
|
|
ShowInOnlineBooking = true,
|
||
|
|
IsFeatured = false,
|
||
|
|
Description = "Forkæl dig selv med en komplet forvandling! Vores Klip & Farve behandling inkluderer professionel farverådgivning, farvning tilpasset din hudtone, præcisionsklip og styling. Perfekt til dig der ønsker et helt nyt look."
|
||
|
|
},
|
||
|
|
["service-2"] = new ServiceDetailRecord
|
||
|
|
{
|
||
|
|
Key = "service-2",
|
||
|
|
Name = "Herreklip",
|
||
|
|
Category = "Klip",
|
||
|
|
CalendarColor = "blue",
|
||
|
|
IsActive = true,
|
||
|
|
DurationRange = "30",
|
||
|
|
FromPrice = "295 kr",
|
||
|
|
EmployeeCount = "6",
|
||
|
|
BookingsThisYear = "312",
|
||
|
|
Tags = new() { new("Populær", "popular") },
|
||
|
|
InternalNotes = "Standard herreklip. Inkluderer vask og styling.",
|
||
|
|
CanBookAsMain = true,
|
||
|
|
CanBookAsAddon = false,
|
||
|
|
ShowInOnlineBooking = true,
|
||
|
|
IsFeatured = true,
|
||
|
|
Description = "Klassisk herreklip med vask, klip og styling. Vores erfarne stylister sikrer dig et skarpt og velplejet look."
|
||
|
|
},
|
||
|
|
["service-3"] = new ServiceDetailRecord
|
||
|
|
{
|
||
|
|
Key = "service-3",
|
||
|
|
Name = "Dameklip",
|
||
|
|
Category = "Klip",
|
||
|
|
CalendarColor = "teal",
|
||
|
|
IsActive = true,
|
||
|
|
DurationRange = "45-60",
|
||
|
|
FromPrice = "395 kr",
|
||
|
|
EmployeeCount = "5",
|
||
|
|
BookingsThisYear = "248",
|
||
|
|
Tags = new() { new("Populær", "popular") },
|
||
|
|
InternalNotes = "Standard dameklip. Altid konsultation først.",
|
||
|
|
CanBookAsMain = true,
|
||
|
|
CanBookAsAddon = false,
|
||
|
|
ShowInOnlineBooking = true,
|
||
|
|
IsFeatured = true,
|
||
|
|
Description = "Professionel dameklip tilpasset din ansigtsform og ønsker. Inkluderer vask, klip og føn."
|
||
|
|
},
|
||
|
|
["service-4"] = new ServiceDetailRecord
|
||
|
|
{
|
||
|
|
Key = "service-4",
|
||
|
|
Name = "Balayage",
|
||
|
|
Category = "Farve",
|
||
|
|
CalendarColor = "purple",
|
||
|
|
IsActive = true,
|
||
|
|
DurationRange = "120-180",
|
||
|
|
FromPrice = "1.295 kr",
|
||
|
|
EmployeeCount = "3",
|
||
|
|
BookingsThisYear = "89",
|
||
|
|
Tags = new() { new("Farve", "color"), new("Premium", "popular") },
|
||
|
|
InternalNotes = "Avanceret farveteknik. Kun certificerede stylister. Kræver tid til konsultation.",
|
||
|
|
CanBookAsMain = true,
|
||
|
|
CanBookAsAddon = false,
|
||
|
|
ShowInOnlineBooking = true,
|
||
|
|
IsFeatured = false,
|
||
|
|
Description = "Smuk, naturlig farveeffekt med håndmalede highlights. Perfekt til dig der ønsker et solkysset look med lavt vedligehold."
|
||
|
|
},
|
||
|
|
["service-5"] = new ServiceDetailRecord
|
||
|
|
{
|
||
|
|
Key = "service-5",
|
||
|
|
Name = "Olaplex Behandling",
|
||
|
|
Category = "Behandlinger",
|
||
|
|
CalendarColor = "green",
|
||
|
|
IsActive = true,
|
||
|
|
DurationRange = "30",
|
||
|
|
FromPrice = "295 kr",
|
||
|
|
EmployeeCount = "6",
|
||
|
|
BookingsThisYear = "134",
|
||
|
|
Tags = new() { new("Tilvalg", "combo") },
|
||
|
|
InternalNotes = "Kan tilføjes til alle farvebehandlinger. Anbefales ved kemisk behandlet hår.",
|
||
|
|
CanBookAsMain = false,
|
||
|
|
CanBookAsAddon = true,
|
||
|
|
ShowInOnlineBooking = true,
|
||
|
|
IsFeatured = false,
|
||
|
|
Description = "Intensiv hårbehandling der reparerer og styrker håret. Ideel som tilvalg til farvebehandlinger."
|
||
|
|
},
|
||
|
|
["service-6"] = new ServiceDetailRecord
|
||
|
|
{
|
||
|
|
Key = "service-6",
|
||
|
|
Name = "Bryllupsfrisure",
|
||
|
|
Category = "Styling",
|
||
|
|
CalendarColor = "amber",
|
||
|
|
IsActive = false,
|
||
|
|
DurationRange = "90-120",
|
||
|
|
FromPrice = "895 kr",
|
||
|
|
EmployeeCount = "2",
|
||
|
|
BookingsThisYear = "24",
|
||
|
|
Tags = new() { new("Premium", "popular"), new("Sæson", "combo") },
|
||
|
|
InternalNotes = "Kun Maria og Anna kan bookes til dette. Kræver prøve-session 2 uger før.",
|
||
|
|
CanBookAsMain = true,
|
||
|
|
CanBookAsAddon = false,
|
||
|
|
ShowInOnlineBooking = false,
|
||
|
|
IsFeatured = false,
|
||
|
|
Description = "Eksklusiv bryllupsfrisure med forudgående konsultation og prøvesession. Vi skaber din drømmefrisure til den store dag."
|
||
|
|
}
|
||
|
|
};
|
||
|
|
|
||
|
|
public static ServiceDetailRecord Get(string key)
|
||
|
|
{
|
||
|
|
if (!Services.TryGetValue(key, out var service))
|
||
|
|
throw new KeyNotFoundException($"Service with key '{key}' not found");
|
||
|
|
return service;
|
||
|
|
}
|
||
|
|
|
||
|
|
public static IEnumerable<string> AllKeys => Services.Keys;
|
||
|
|
}
|
||
|
|
|
||
|
|
/// <summary>
|
||
|
|
/// Complete service detail record used across all detail ViewComponents.
|
||
|
|
/// </summary>
|
||
|
|
public record ServiceDetailRecord
|
||
|
|
{
|
||
|
|
// Identity
|
||
|
|
public required string Key { get; init; }
|
||
|
|
public required string Name { get; init; }
|
||
|
|
public required string Category { get; init; }
|
||
|
|
public required string CalendarColor { get; init; }
|
||
|
|
public required bool IsActive { get; init; }
|
||
|
|
|
||
|
|
// Stats (header)
|
||
|
|
public required string DurationRange { get; init; }
|
||
|
|
public required string FromPrice { get; init; }
|
||
|
|
public required string EmployeeCount { get; init; }
|
||
|
|
public required string BookingsThisYear { get; init; }
|
||
|
|
|
||
|
|
// Tags
|
||
|
|
public List<ServiceTag> Tags { get; init; } = new();
|
||
|
|
|
||
|
|
// Generelt tab - Grundlæggende
|
||
|
|
public required string InternalNotes { get; init; }
|
||
|
|
|
||
|
|
// Generelt tab - Bookingtype
|
||
|
|
public required bool CanBookAsMain { get; init; }
|
||
|
|
public required bool CanBookAsAddon { get; init; }
|
||
|
|
|
||
|
|
// Generelt tab - Online booking
|
||
|
|
public required bool ShowInOnlineBooking { get; init; }
|
||
|
|
public required bool IsFeatured { get; init; }
|
||
|
|
public required string Description { get; init; }
|
||
|
|
}
|
||
|
|
|
||
|
|
public record ServiceTag(string Text, string CssClass);
|