Introduces new ResourceColumnDataSource and ResourceHeaderRenderer to support column rendering by resources instead of dates Enables dynamic calendar mode switching between date and resource views Updates core managers and services to support async column retrieval Refactors data source interfaces to use Promise-based methods Improves calendar flexibility and resource management capabilities
514 lines
14 KiB
JSON
514 lines
14 KiB
JSON
[
|
|
{
|
|
"id": "BOOK001",
|
|
"customerId": "CUST001",
|
|
"status": "arrived",
|
|
"createdAt": "2025-08-05T08:00:00Z",
|
|
"services": [
|
|
{
|
|
"serviceId": "SRV001",
|
|
"serviceName": "Klipning og styling",
|
|
"baseDuration": 60,
|
|
"basePrice": 500,
|
|
"customPrice": 500,
|
|
"resourceId": "EMP001"
|
|
}
|
|
],
|
|
"totalPrice": 500,
|
|
"notes": "Kunde ønsker lidt kortere"
|
|
},
|
|
{
|
|
"id": "BOOK002",
|
|
"customerId": "CUST002",
|
|
"status": "paid",
|
|
"createdAt": "2025-08-05T09:00:00Z",
|
|
"services": [
|
|
{
|
|
"serviceId": "SRV002",
|
|
"serviceName": "Hårvask",
|
|
"baseDuration": 30,
|
|
"basePrice": 100,
|
|
"customPrice": 100,
|
|
"resourceId": "STUDENT001"
|
|
},
|
|
{
|
|
"serviceId": "SRV003",
|
|
"serviceName": "Bundfarve",
|
|
"baseDuration": 90,
|
|
"basePrice": 800,
|
|
"customPrice": 800,
|
|
"resourceId": "EMP001"
|
|
}
|
|
],
|
|
"totalPrice": 900,
|
|
"notes": "Split booking: Elev laver hårvask, master laver farve"
|
|
},
|
|
{
|
|
"id": "BOOK003",
|
|
"customerId": "CUST003",
|
|
"status": "created",
|
|
"createdAt": "2025-08-05T07:00:00Z",
|
|
"services": [
|
|
{
|
|
"serviceId": "SRV004A",
|
|
"serviceName": "Bryllupsfrisure - Del 1",
|
|
"baseDuration": 60,
|
|
"basePrice": 750,
|
|
"customPrice": 750,
|
|
"resourceId": "EMP001"
|
|
},
|
|
{
|
|
"serviceId": "SRV004B",
|
|
"serviceName": "Bryllupsfrisure - Del 2",
|
|
"baseDuration": 60,
|
|
"basePrice": 750,
|
|
"customPrice": 750,
|
|
"resourceId": "EMP002"
|
|
}
|
|
],
|
|
"totalPrice": 1500,
|
|
"notes": "Equal-split: To master stylister arbejder sammen"
|
|
},
|
|
{
|
|
"id": "BOOK004",
|
|
"customerId": "CUST004",
|
|
"status": "arrived",
|
|
"createdAt": "2025-08-05T10:00:00Z",
|
|
"services": [
|
|
{
|
|
"serviceId": "SRV005",
|
|
"serviceName": "Herreklipning",
|
|
"baseDuration": 30,
|
|
"basePrice": 350,
|
|
"customPrice": 350,
|
|
"resourceId": "EMP003"
|
|
}
|
|
],
|
|
"totalPrice": 350
|
|
},
|
|
{
|
|
"id": "BOOK005",
|
|
"customerId": "CUST005",
|
|
"status": "paid",
|
|
"createdAt": "2025-08-05T11:00:00Z",
|
|
"services": [
|
|
{
|
|
"serviceId": "SRV006",
|
|
"serviceName": "Balayage langt hår",
|
|
"baseDuration": 120,
|
|
"basePrice": 1200,
|
|
"customPrice": 1200,
|
|
"resourceId": "EMP002"
|
|
}
|
|
],
|
|
"totalPrice": 1200,
|
|
"notes": "Kunde ønsker naturlig blond tone"
|
|
},
|
|
{
|
|
"id": "BOOK006",
|
|
"customerId": "CUST006",
|
|
"status": "created",
|
|
"createdAt": "2025-08-06T08:00:00Z",
|
|
"services": [
|
|
{
|
|
"serviceId": "SRV007",
|
|
"serviceName": "Permanent",
|
|
"baseDuration": 90,
|
|
"basePrice": 900,
|
|
"customPrice": 900,
|
|
"resourceId": "EMP004"
|
|
}
|
|
],
|
|
"totalPrice": 900
|
|
},
|
|
{
|
|
"id": "BOOK007",
|
|
"customerId": "CUST007",
|
|
"status": "arrived",
|
|
"createdAt": "2025-08-06T09:00:00Z",
|
|
"services": [
|
|
{
|
|
"serviceId": "SRV008",
|
|
"serviceName": "Highlights",
|
|
"baseDuration": 90,
|
|
"basePrice": 850,
|
|
"customPrice": 850,
|
|
"resourceId": "EMP001"
|
|
},
|
|
{
|
|
"serviceId": "SRV009",
|
|
"serviceName": "Styling",
|
|
"baseDuration": 30,
|
|
"basePrice": 200,
|
|
"customPrice": 200,
|
|
"resourceId": "EMP001"
|
|
}
|
|
],
|
|
"totalPrice": 1050,
|
|
"notes": "Highlights + styling samme stylist"
|
|
},
|
|
{
|
|
"id": "BOOK008",
|
|
"customerId": "CUST008",
|
|
"status": "paid",
|
|
"createdAt": "2025-08-06T10:00:00Z",
|
|
"services": [
|
|
{
|
|
"serviceId": "SRV010",
|
|
"serviceName": "Klipning",
|
|
"baseDuration": 45,
|
|
"basePrice": 450,
|
|
"customPrice": 450,
|
|
"resourceId": "EMP004"
|
|
}
|
|
],
|
|
"totalPrice": 450
|
|
},
|
|
{
|
|
"id": "BOOK009",
|
|
"customerId": "CUST001",
|
|
"status": "created",
|
|
"createdAt": "2025-08-07T08:00:00Z",
|
|
"services": [
|
|
{
|
|
"serviceId": "SRV011",
|
|
"serviceName": "Farve behandling",
|
|
"baseDuration": 120,
|
|
"basePrice": 950,
|
|
"customPrice": 950,
|
|
"resourceId": "EMP002"
|
|
}
|
|
],
|
|
"totalPrice": 950
|
|
},
|
|
{
|
|
"id": "BOOK010",
|
|
"customerId": "CUST002",
|
|
"status": "arrived",
|
|
"createdAt": "2025-08-07T09:00:00Z",
|
|
"services": [
|
|
{
|
|
"serviceId": "SRV012",
|
|
"serviceName": "Skæg trimning",
|
|
"baseDuration": 20,
|
|
"basePrice": 200,
|
|
"customPrice": 200,
|
|
"resourceId": "EMP003"
|
|
}
|
|
],
|
|
"totalPrice": 200
|
|
},
|
|
{
|
|
"id": "BOOK011",
|
|
"customerId": "CUST003",
|
|
"status": "paid",
|
|
"createdAt": "2025-08-07T10:00:00Z",
|
|
"services": [
|
|
{
|
|
"serviceId": "SRV002",
|
|
"serviceName": "Hårvask",
|
|
"baseDuration": 30,
|
|
"basePrice": 100,
|
|
"customPrice": 100,
|
|
"resourceId": "STUDENT002"
|
|
},
|
|
{
|
|
"serviceId": "SRV013",
|
|
"serviceName": "Ombré",
|
|
"baseDuration": 100,
|
|
"basePrice": 1100,
|
|
"customPrice": 1100,
|
|
"resourceId": "EMP002"
|
|
}
|
|
],
|
|
"totalPrice": 1200,
|
|
"notes": "Split booking: Student hårvask, master ombré"
|
|
},
|
|
{
|
|
"id": "BOOK012",
|
|
"customerId": "CUST004",
|
|
"status": "created",
|
|
"createdAt": "2025-08-08T08:00:00Z",
|
|
"services": [
|
|
{
|
|
"serviceId": "SRV014",
|
|
"serviceName": "Føntørring",
|
|
"baseDuration": 30,
|
|
"basePrice": 250,
|
|
"customPrice": 250,
|
|
"resourceId": "STUDENT001"
|
|
}
|
|
],
|
|
"totalPrice": 250
|
|
},
|
|
{
|
|
"id": "BOOK013",
|
|
"customerId": "CUST005",
|
|
"status": "arrived",
|
|
"createdAt": "2025-08-08T09:00:00Z",
|
|
"services": [
|
|
{
|
|
"serviceId": "SRV015",
|
|
"serviceName": "Opsætning",
|
|
"baseDuration": 60,
|
|
"basePrice": 700,
|
|
"customPrice": 700,
|
|
"resourceId": "EMP004"
|
|
}
|
|
],
|
|
"totalPrice": 700,
|
|
"notes": "Fest opsætning"
|
|
},
|
|
{
|
|
"id": "BOOK014",
|
|
"customerId": "CUST006",
|
|
"status": "created",
|
|
"createdAt": "2025-08-09T08:00:00Z",
|
|
"services": [
|
|
{
|
|
"serviceId": "SRV016A",
|
|
"serviceName": "Ekstensions - Del 1",
|
|
"baseDuration": 90,
|
|
"basePrice": 1250,
|
|
"customPrice": 1250,
|
|
"resourceId": "EMP001"
|
|
},
|
|
{
|
|
"serviceId": "SRV016B",
|
|
"serviceName": "Ekstensions - Del 2",
|
|
"baseDuration": 90,
|
|
"basePrice": 1250,
|
|
"customPrice": 1250,
|
|
"resourceId": "EMP004"
|
|
}
|
|
],
|
|
"totalPrice": 2500,
|
|
"notes": "Equal-split: To stylister arbejder sammen om extensions"
|
|
},
|
|
{
|
|
"id": "BOOK015",
|
|
"customerId": "CUST007",
|
|
"status": "noshow",
|
|
"createdAt": "2025-08-09T09:00:00Z",
|
|
"services": [
|
|
{
|
|
"serviceId": "SRV001",
|
|
"serviceName": "Klipning og styling",
|
|
"baseDuration": 60,
|
|
"basePrice": 500,
|
|
"customPrice": 500,
|
|
"resourceId": "EMP002"
|
|
}
|
|
],
|
|
"totalPrice": 500,
|
|
"notes": "Kunde mødte ikke op"
|
|
},
|
|
{
|
|
"id": "BOOK-NOV22-001",
|
|
"customerId": "CUST001",
|
|
"status": "arrived",
|
|
"createdAt": "2025-11-20T10:00:00Z",
|
|
"services": [
|
|
{ "serviceId": "SRV-WASH", "serviceName": "Hårvask", "baseDuration": 30, "basePrice": 100, "resourceId": "STUDENT001" },
|
|
{ "serviceId": "SRV-BAL", "serviceName": "Balayage", "baseDuration": 90, "basePrice": 1200, "resourceId": "EMP001" }
|
|
],
|
|
"totalPrice": 1300,
|
|
"notes": "Split: Elev vasker, Camilla farver"
|
|
},
|
|
{
|
|
"id": "BOOK-NOV22-002",
|
|
"customerId": "CUST002",
|
|
"status": "arrived",
|
|
"createdAt": "2025-11-20T11:00:00Z",
|
|
"services": [
|
|
{ "serviceId": "SRV-HERREKLIP", "serviceName": "Herreklipning", "baseDuration": 30, "basePrice": 350, "resourceId": "EMP003" }
|
|
],
|
|
"totalPrice": 350
|
|
},
|
|
{
|
|
"id": "BOOK-NOV22-003",
|
|
"customerId": "CUST003",
|
|
"status": "created",
|
|
"createdAt": "2025-11-20T12:00:00Z",
|
|
"services": [
|
|
{ "serviceId": "SRV-FARVE", "serviceName": "Farvning", "baseDuration": 120, "basePrice": 900, "resourceId": "EMP002" }
|
|
],
|
|
"totalPrice": 900
|
|
},
|
|
{
|
|
"id": "BOOK-NOV22-004",
|
|
"customerId": "CUST004",
|
|
"status": "arrived",
|
|
"createdAt": "2025-11-20T13:00:00Z",
|
|
"services": [
|
|
{ "serviceId": "SRV-KLIP", "serviceName": "Dameklipning", "baseDuration": 60, "basePrice": 450, "resourceId": "EMP004" }
|
|
],
|
|
"totalPrice": 450
|
|
},
|
|
{
|
|
"id": "BOOK-NOV22-005",
|
|
"customerId": "CUST005",
|
|
"status": "created",
|
|
"createdAt": "2025-11-20T14:00:00Z",
|
|
"services": [
|
|
{ "serviceId": "SRV-STYLE", "serviceName": "Styling", "baseDuration": 60, "basePrice": 400, "resourceId": "EMP001" }
|
|
],
|
|
"totalPrice": 400
|
|
},
|
|
{
|
|
"id": "BOOK-NOV23-001",
|
|
"customerId": "CUST006",
|
|
"status": "created",
|
|
"createdAt": "2025-11-21T09:00:00Z",
|
|
"services": [
|
|
{ "serviceId": "SRV-PERM", "serviceName": "Permanent", "baseDuration": 150, "basePrice": 1100, "resourceId": "EMP002" }
|
|
],
|
|
"totalPrice": 1100
|
|
},
|
|
{
|
|
"id": "BOOK-NOV23-002",
|
|
"customerId": "CUST007",
|
|
"status": "created",
|
|
"createdAt": "2025-11-21T10:00:00Z",
|
|
"services": [
|
|
{ "serviceId": "SRV-SKAEG", "serviceName": "Skæg trimning", "baseDuration": 30, "basePrice": 200, "resourceId": "EMP003" }
|
|
],
|
|
"totalPrice": 200
|
|
},
|
|
{
|
|
"id": "BOOK-NOV23-003",
|
|
"customerId": "CUST008",
|
|
"status": "created",
|
|
"createdAt": "2025-11-21T11:00:00Z",
|
|
"services": [
|
|
{ "serviceId": "SRV-WASH", "serviceName": "Hårvask", "baseDuration": 30, "basePrice": 100, "resourceId": "STUDENT002" },
|
|
{ "serviceId": "SRV-HIGH", "serviceName": "Highlights", "baseDuration": 120, "basePrice": 1000, "resourceId": "EMP001" }
|
|
],
|
|
"totalPrice": 1100,
|
|
"notes": "Split: Elev vasker, Camilla laver highlights"
|
|
},
|
|
{
|
|
"id": "BOOK-NOV24-001",
|
|
"customerId": "CUST001",
|
|
"status": "created",
|
|
"createdAt": "2025-11-22T08:00:00Z",
|
|
"services": [
|
|
{ "serviceId": "SRV-BRYLLUP1", "serviceName": "Bryllupsfrisure Del 1", "baseDuration": 60, "basePrice": 750, "resourceId": "EMP001" },
|
|
{ "serviceId": "SRV-BRYLLUP2", "serviceName": "Bryllupsfrisure Del 2", "baseDuration": 60, "basePrice": 750, "resourceId": "EMP002" }
|
|
],
|
|
"totalPrice": 1500,
|
|
"notes": "Equal split: Camilla og Isabella arbejder sammen"
|
|
},
|
|
{
|
|
"id": "BOOK-NOV24-002",
|
|
"customerId": "CUST002",
|
|
"status": "created",
|
|
"createdAt": "2025-11-22T09:00:00Z",
|
|
"services": [
|
|
{ "serviceId": "SRV-FADE", "serviceName": "Fade klipning", "baseDuration": 45, "basePrice": 400, "resourceId": "EMP003" }
|
|
],
|
|
"totalPrice": 400
|
|
},
|
|
{
|
|
"id": "BOOK-NOV24-003",
|
|
"customerId": "CUST003",
|
|
"status": "created",
|
|
"createdAt": "2025-11-22T10:00:00Z",
|
|
"services": [
|
|
{ "serviceId": "SRV-KLIPVASK", "serviceName": "Klipning og vask", "baseDuration": 60, "basePrice": 500, "resourceId": "EMP004" }
|
|
],
|
|
"totalPrice": 500
|
|
},
|
|
{
|
|
"id": "BOOK-NOV25-001",
|
|
"customerId": "CUST004",
|
|
"status": "created",
|
|
"createdAt": "2025-11-23T08:00:00Z",
|
|
"services": [
|
|
{ "serviceId": "SRV-BALKORT", "serviceName": "Balayage kort hår", "baseDuration": 90, "basePrice": 900, "resourceId": "EMP001" }
|
|
],
|
|
"totalPrice": 900
|
|
},
|
|
{
|
|
"id": "BOOK-NOV25-002",
|
|
"customerId": "CUST005",
|
|
"status": "created",
|
|
"createdAt": "2025-11-23T09:00:00Z",
|
|
"services": [
|
|
{ "serviceId": "SRV-EXT", "serviceName": "Extensions", "baseDuration": 180, "basePrice": 2500, "resourceId": "EMP002" }
|
|
],
|
|
"totalPrice": 2500
|
|
},
|
|
{
|
|
"id": "BOOK-NOV25-003",
|
|
"customerId": "CUST006",
|
|
"status": "created",
|
|
"createdAt": "2025-11-23T10:00:00Z",
|
|
"services": [
|
|
{ "serviceId": "SRV-HERRESKAEG", "serviceName": "Herreklipning + skæg", "baseDuration": 60, "basePrice": 500, "resourceId": "EMP003" }
|
|
],
|
|
"totalPrice": 500
|
|
},
|
|
{
|
|
"id": "BOOK-NOV26-001",
|
|
"customerId": "CUST007",
|
|
"status": "created",
|
|
"createdAt": "2025-11-24T08:00:00Z",
|
|
"services": [
|
|
{ "serviceId": "SRV-FARVKOR", "serviceName": "Farvekorrektion", "baseDuration": 180, "basePrice": 1800, "resourceId": "EMP001" }
|
|
],
|
|
"totalPrice": 1800
|
|
},
|
|
{
|
|
"id": "BOOK-NOV26-002",
|
|
"customerId": "CUST008",
|
|
"status": "created",
|
|
"createdAt": "2025-11-24T09:00:00Z",
|
|
"services": [
|
|
{ "serviceId": "SRV-KERATIN", "serviceName": "Keratinbehandling", "baseDuration": 150, "basePrice": 1400, "resourceId": "EMP002" }
|
|
],
|
|
"totalPrice": 1400
|
|
},
|
|
{
|
|
"id": "BOOK-NOV26-003",
|
|
"customerId": "CUST001",
|
|
"status": "created",
|
|
"createdAt": "2025-11-24T10:00:00Z",
|
|
"services": [
|
|
{ "serviceId": "SRV-SKINFADE", "serviceName": "Skin fade", "baseDuration": 45, "basePrice": 450, "resourceId": "EMP003" }
|
|
],
|
|
"totalPrice": 450
|
|
},
|
|
{
|
|
"id": "BOOK-NOV27-001",
|
|
"customerId": "CUST002",
|
|
"status": "created",
|
|
"createdAt": "2025-11-25T08:00:00Z",
|
|
"services": [
|
|
{ "serviceId": "SRV-FULLCOLOR", "serviceName": "Full color", "baseDuration": 120, "basePrice": 1000, "resourceId": "EMP001" }
|
|
],
|
|
"totalPrice": 1000
|
|
},
|
|
{
|
|
"id": "BOOK-NOV27-002",
|
|
"customerId": "CUST003",
|
|
"status": "created",
|
|
"createdAt": "2025-11-25T09:00:00Z",
|
|
"services": [
|
|
{ "serviceId": "SRV-WASH", "serviceName": "Hårvask", "baseDuration": 30, "basePrice": 100, "resourceId": "STUDENT001" },
|
|
{ "serviceId": "SRV-BABY", "serviceName": "Babylights", "baseDuration": 180, "basePrice": 1500, "resourceId": "EMP002" }
|
|
],
|
|
"totalPrice": 1600,
|
|
"notes": "Split: Elev vasker, Isabella laver babylights"
|
|
},
|
|
{
|
|
"id": "BOOK-NOV27-003",
|
|
"customerId": "CUST004",
|
|
"status": "created",
|
|
"createdAt": "2025-11-25T10:00:00Z",
|
|
"services": [
|
|
{ "serviceId": "SRV-KLASSISK", "serviceName": "Klassisk herreklip", "baseDuration": 30, "basePrice": 300, "resourceId": "EMP003" }
|
|
],
|
|
"totalPrice": 300
|
|
}
|
|
]
|