Files
Cibello-app/packages/database/src/seed/data/seasonEvents.ts
T
Sven (AAMOS AI) f0488eefd6
CI / Typecheck, test & build (push) Failing after 42s
feat(seed): DE/FR/NL-högtider (MIKRO C2)
2026-08-14 22:19:04 +07:00

658 lines
17 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* Seed: datadriven Season & Events Engine (spec §28).
* Datumregler beräknas av recommendation-engine (midsommar, påsk, advent).
*/
export interface SeedSeasonEvent {
id: string;
slug: string;
nameSv: string;
nameLocalized: string;
market: string;
dateRule:
| { kind: "fixed"; monthDay: string }
| { kind: "range"; startMonthDay: string; endMonthDay: string }
| { kind: "computed"; algorithm: "midsummer" | "easter" | "advent" | "custom" }
| { kind: "easter-offset"; days: number }
| { kind: "nth-weekday"; month: number; weekday: number; n: number | "last" };
leadDays: number;
foodTags: string[];
recipeSlugs: string[];
priority: number;
}
export const SEED_SEASON_EVENTS: SeedSeasonEvent[] = [
{
id: "se-midsommar",
slug: "midsommar",
nameSv: "Midsommar",
nameLocalized: "",
market: "SE",
dateRule: { kind: "computed", algorithm: "midsummer" },
leadDays: 10,
foodTags: ["sill", "färskpotatis", "jordgubbar", "grillat", "västerbottensostpaj"],
recipeSlugs: ["sill-och-farskpotatis", "vasterbottensostpaj", "kottbullar-med-potatismos"],
priority: 100,
},
{
id: "se-jul",
slug: "jul",
nameSv: "Jul",
nameLocalized: "",
market: "SE",
dateRule: { kind: "range", startMonthDay: "12-20", endMonthDay: "12-26" },
leadDays: 21,
foodTags: ["julbord", "köttbullar", "janssons", "sill", "skinka"],
recipeSlugs: ["jansons-frestelse", "kottbullar-med-potatismos"],
priority: 100,
},
{
id: "se-pask",
slug: "påsk",
nameSv: "Påsk",
nameLocalized: "",
market: "SE",
dateRule: { kind: "computed", algorithm: "easter" },
leadDays: 10,
foodTags: ["ägg", "sill", "lamm", "lax"],
recipeSlugs: ["sill-och-farskpotatis", "ugnsbakad-lax-med-citron-och-dill"],
priority: 90,
},
{
id: "se-nyar",
slug: "nyår",
nameSv: "Nyårsafton",
nameLocalized: "",
market: "SE",
dateRule: { kind: "fixed", monthDay: "12-31" },
leadDays: 7,
foodTags: ["fest", "skaldjur", "lyx"],
recipeSlugs: [],
priority: 80,
},
{
id: "se-kraftskiva",
slug: "kraftskiva",
nameSv: "Kräftskivepremiär",
nameLocalized: "",
market: "SE",
dateRule: { kind: "range", startMonthDay: "08-01", endMonthDay: "08-31" },
leadDays: 7,
foodTags: ["kräftor", "västerbottensostpaj", "knäckebröd"],
recipeSlugs: ["vasterbottensostpaj"],
priority: 70,
},
{
id: "se-surstromming",
slug: "surstromming",
nameSv: "Surströmmingspremiär",
nameLocalized: "",
market: "SE",
dateRule: { kind: "fixed", monthDay: "08-15" },
leadDays: 5,
foodTags: ["surströmming", "tunnbröd", "mandelpotatis"],
recipeSlugs: [],
priority: 40,
},
{
id: "se-lucia",
slug: "lucia",
nameSv: "Lucia",
nameLocalized: "",
market: "SE",
dateRule: { kind: "fixed", monthDay: "12-13" },
leadDays: 7,
foodTags: ["lussekatter", "pepparkakor", "glögg"],
recipeSlugs: [],
priority: 60,
},
{
id: "se-valborg",
slug: "valborg",
nameSv: "Valborg",
nameLocalized: "",
market: "SE",
dateRule: { kind: "fixed", monthDay: "04-30" },
leadDays: 5,
foodTags: ["grillat", "vårmat"],
recipeSlugs: ["halloumiburgare"],
priority: 50,
},
{
id: "se-grillsasong",
slug: "grillsasong",
nameSv: "Grillsäsong",
nameLocalized: "",
market: "SE",
dateRule: { kind: "range", startMonthDay: "05-15", endMonthDay: "08-31" },
leadDays: 0,
foodTags: ["grillat", "sallad", "sommarmat"],
recipeSlugs: ["halloumiburgare", "grekisk-sallad"],
priority: 30,
},
{
id: "se-skolstart",
slug: "skolstart",
nameSv: "Skolstart",
nameLocalized: "",
market: "SE",
dateRule: { kind: "range", startMonthDay: "08-10", endMonthDay: "08-31" },
leadDays: 7,
foodTags: ["matlåda", "vardagsmat", "snabbt"],
recipeSlugs: ["spaghetti-med-kottfarssas", "chili-con-carne"],
priority: 40,
},
{
id: "se-alla-hjartans",
slug: "alla-hjartans-dag",
nameSv: "Alla hjärtans dag",
nameLocalized: "",
market: "SE",
dateRule: { kind: "fixed", monthDay: "02-14" },
leadDays: 5,
foodTags: ["middag för två", "lyx", "dessert"],
recipeSlugs: ["teriyakilax-med-ris"],
priority: 50,
},
{
id: "int-halloween",
slug: "halloween",
nameSv: "Halloween",
nameLocalized: "",
market: "SE",
dateRule: { kind: "fixed", monthDay: "10-31" },
leadDays: 7,
foodTags: ["pumpa", "barnkalas", "höstmat"],
recipeSlugs: ["tomatsoppa-med-basilika"],
priority: 40,
},
{
id: "int-oktoberfest",
slug: "oktoberfest",
nameSv: "Oktoberfest",
nameLocalized: "",
market: "SE",
dateRule: { kind: "range", startMonthDay: "09-20", endMonthDay: "10-05" },
leadDays: 5,
foodTags: ["korv", "surkål", "öl"],
recipeSlugs: [],
priority: 20,
},
{
id: "int-thanksgiving",
slug: "thanksgiving",
nameSv: "Thanksgiving",
nameLocalized: "",
market: "US",
dateRule: { kind: "range", startMonthDay: "11-20", endMonthDay: "11-28" },
leadDays: 10,
foodTags: ["kalkon", "pumpapaj"],
recipeSlugs: [],
priority: 90,
},
{
id: "int-ramadan-eid",
slug: "eid",
nameSv: "Eid al-Fitr",
nameLocalized: "",
market: "SE",
// Rörligt datum (månkalender) uppdateras årligen av admin tills kalenderconnector finns.
dateRule: { kind: "computed", algorithm: "custom" },
leadDays: 14,
foodTags: ["fest", "lamm", "dadlar", "sötsaker"],
recipeSlugs: [],
priority: 90,
},
// --- Norge (NO) ---
{
id: "no-julaften",
slug: "julaften",
nameSv: "Julaften",
nameLocalized: "Julaften",
market: "NO",
dateRule: { kind: "fixed", monthDay: "12-24" },
leadDays: 21,
foodTags: ["ribbe", "pinnekjott", "lutefisk", "surkal", "riskrem", "medisterkake"],
recipeSlugs: [],
priority: 100,
},
{
id: "no-paske",
slug: "paske",
nameSv: "Påske",
nameLocalized: "Påske",
market: "NO",
dateRule: { kind: "computed", algorithm: "easter" },
leadDays: 10,
foodTags: ["lam", "egg", "appelsin", "marsipan", "paskeol"],
recipeSlugs: [],
priority: 90,
},
{
id: "no-sankthans",
slug: "sankthans",
nameSv: "Sankthansaften",
nameLocalized: "Sankthansaften",
market: "NO",
dateRule: { kind: "fixed", monthDay: "06-23" },
leadDays: 7,
foodTags: ["grillmat", "rommegrot", "spekemat", "jordbaer", "reker"],
recipeSlugs: [],
priority: 80,
},
{
id: "no-nyttarsaften",
slug: "nyttarsaften",
nameSv: "Nyttårsaften",
nameLocalized: "Nyttårsaften",
market: "NO",
dateRule: { kind: "fixed", monthDay: "12-31" },
leadDays: 7,
foodTags: ["pinnekjott", "torsk", "reker", "kransekake"],
recipeSlugs: [],
priority: 90,
},
{
id: "no-farikal",
slug: "farikalens-festdag",
nameSv: "Fårikålens festdag",
nameLocalized: "Fårikålens festdag",
market: "NO",
dateRule: { kind: "nth-weekday", month: 9, weekday: 4, n: "last" },
leadDays: 5,
foodTags: ["far", "kal", "pepperkorn", "potet"],
recipeSlugs: [],
priority: 80,
},
// --- Danmark (DK) ---
{
id: "dk-juleaften",
slug: "juleaften",
nameSv: "Juleaften",
nameLocalized: "Juleaften",
market: "DK",
dateRule: { kind: "fixed", monthDay: "12-24" },
leadDays: 21,
foodTags: ["flaeskesteg", "and", "rodkal", "brunede-kartofler", "risalamande"],
recipeSlugs: [],
priority: 100,
},
{
id: "dk-paske",
slug: "paske",
nameSv: "Påske",
nameLocalized: "Påske",
market: "DK",
dateRule: { kind: "computed", algorithm: "easter" },
leadDays: 7,
foodTags: ["sild", "aeg", "lammesteg", "nye-kartofler", "snaps"],
recipeSlugs: [],
priority: 90,
},
{
id: "dk-nytarsaften",
slug: "nytarsaften",
nameSv: "Nytårsaften",
nameLocalized: "Nytårsaften",
market: "DK",
dateRule: { kind: "fixed", monthDay: "12-31" },
leadDays: 7,
foodTags: ["kogt-torsk", "kransekage", "marcipan"],
recipeSlugs: [],
priority: 90,
},
{
id: "dk-julefrokost",
slug: "julefrokost",
nameSv: "Julefrokost",
nameLocalized: "Julefrokost",
market: "DK",
dateRule: { kind: "range", startMonthDay: "12-01", endMonthDay: "12-30" },
leadDays: 7,
foodTags: ["sild", "frikadeller", "leverpostej", "ribbensteg", "snaps"],
recipeSlugs: [],
priority: 80,
},
{
id: "dk-mortensaften",
slug: "mortensaften",
nameSv: "Mortensaften",
nameLocalized: "Mortensaften",
market: "DK",
dateRule: { kind: "fixed", monthDay: "11-10" },
leadDays: 7,
foodTags: ["and", "gas", "rodkal", "brunede-kartofler", "brun-sovs"],
recipeSlugs: [],
priority: 75,
},
// --- Finland (FI) ---
{
id: "fi-joulu",
slug: "joulu",
nameSv: "Jouluaatto",
nameLocalized: "Jouluaatto",
market: "FI",
dateRule: { kind: "fixed", monthDay: "12-24" },
leadDays: 21,
foodTags: ["joulukinkku", "lanttulaatikko", "rosolli", "graavilohi", "joulutorttu"],
recipeSlugs: [],
priority: 100,
},
{
id: "fi-paasiainen",
slug: "paasiainen",
nameSv: "Pääsiäinen",
nameLocalized: "Pääsiäinen",
market: "FI",
dateRule: { kind: "computed", algorithm: "easter" },
leadDays: 7,
foodTags: ["mammi", "pasha", "lammas", "suklaamuna"],
recipeSlugs: [],
priority: 90,
},
{
id: "fi-juhannus",
slug: "juhannus",
nameSv: "Juhannus",
nameLocalized: "Juhannus",
market: "FI",
dateRule: { kind: "computed", algorithm: "midsummer" },
leadDays: 7,
foodTags: ["grillimakkara", "uudet-perunat", "silli", "graavilohi"],
recipeSlugs: [],
priority: 85,
},
{
id: "fi-rapujuhlat",
slug: "rapujuhlat",
nameSv: "Rapujuhlat",
nameLocalized: "Rapujuhlat",
market: "FI",
dateRule: { kind: "range", startMonthDay: "07-21", endMonthDay: "09-30" },
leadDays: 7,
foodTags: ["rapu", "tilli", "ruisleipa", "snapsi"],
recipeSlugs: [],
priority: 80,
},
{
id: "fi-vappu",
slug: "vappu",
nameSv: "Vappu",
nameLocalized: "Vappu",
market: "FI",
dateRule: { kind: "fixed", monthDay: "05-01" },
leadDays: 7,
foodTags: ["sima", "tippaleipa", "munkki"],
recipeSlugs: [],
priority: 75,
},
// --- Island (IS) ---
{
id: "is-adfangadagur",
slug: "adfangadagur",
nameSv: "Aðfangadagur",
nameLocalized: "Aðfangadagur",
market: "IS",
dateRule: { kind: "fixed", monthDay: "12-24" },
leadDays: 21,
foodTags: ["hamborgarhryggur", "hangikjot", "laufabraud", "rjupa"],
recipeSlugs: [],
priority: 100,
},
{
id: "is-paskar",
slug: "paskar",
nameSv: "Páskar",
nameLocalized: "Páskar",
market: "IS",
dateRule: { kind: "computed", algorithm: "easter" },
leadDays: 5,
foodTags: ["lambakjot", "lambalaeri", "paskaegg"],
recipeSlugs: [],
priority: 90,
},
{
id: "is-thorrablot",
slug: "thorrablot",
nameSv: "Þorrablót",
nameLocalized: "Þorrablót",
market: "IS",
dateRule: { kind: "range", startMonthDay: "01-23", endMonthDay: "02-22" },
leadDays: 7,
foodTags: ["hakarl", "svid", "hangikjot", "hardfiskur", "brennivin"],
recipeSlugs: [],
priority: 80,
},
{
id: "is-sprengidagur",
slug: "sprengidagur",
nameSv: "Sprengidagur",
nameLocalized: "Sprengidagur",
market: "IS",
dateRule: { kind: "easter-offset", days: -47 },
leadDays: 3,
foodTags: ["saltkjot", "baunir", "gulrofa"],
recipeSlugs: [],
priority: 70,
},
{
id: "is-thorlaksmessa",
slug: "thorlaksmessa",
nameSv: "Þorláksmessa",
nameLocalized: "Þorláksmessa",
market: "IS",
dateRule: { kind: "fixed", monthDay: "12-23" },
leadDays: 5,
foodTags: ["skata", "hangikjot", "rugbraud"],
recipeSlugs: [],
priority: 70,
},
// --- Tyskland (DE) ---
{
id: "de-weihnachten",
slug: "weihnachten",
nameSv: "Weihnachten",
nameLocalized: "Weihnachten",
market: "DE",
dateRule: { kind: "fixed", monthDay: "12-24" },
leadDays: 21,
foodTags: ["gans", "karpfen", "stollen", "lebkuchen", "wurstchen"],
recipeSlugs: [],
priority: 100,
},
{
id: "de-silvester",
slug: "silvester",
nameSv: "Silvester",
nameLocalized: "Silvester",
market: "DE",
dateRule: { kind: "fixed", monthDay: "12-31" },
leadDays: 6,
foodTags: ["berliner", "raclette", "fondue", "linsen", "heringssalat"],
recipeSlugs: [],
priority: 90,
},
{
id: "de-ostern",
slug: "ostern",
nameSv: "Ostern",
nameLocalized: "Ostern",
market: "DE",
dateRule: { kind: "computed", algorithm: "easter" },
leadDays: 10,
foodTags: ["lamm", "eier", "osterbrot", "schinken", "hefezopf"],
recipeSlugs: [],
priority: 90,
},
{
id: "de-oktoberfest",
slug: "oktoberfest",
nameSv: "Oktoberfest",
nameLocalized: "Oktoberfest",
market: "DE",
dateRule: { kind: "range", startMonthDay: "09-19", endMonthDay: "10-04" },
leadDays: 7,
foodTags: ["hendl", "schweinshaxe", "weisswurst", "brezn", "obatzda"],
recipeSlugs: [],
priority: 85,
},
{
id: "de-karneval",
slug: "karneval",
nameSv: "Karneval",
nameLocalized: "Karneval",
market: "DE",
dateRule: { kind: "easter-offset", days: -48 },
leadDays: 5,
foodTags: ["krapfen", "berliner", "mutzenmandeln"],
recipeSlugs: [],
priority: 70,
},
{
id: "de-spargelzeit",
slug: "spargelzeit",
nameSv: "Spargelzeit",
nameLocalized: "Spargelzeit",
market: "DE",
dateRule: { kind: "range", startMonthDay: "04-15", endMonthDay: "06-24" },
leadDays: 4,
foodTags: ["spargel", "sauce-hollandaise", "schinken", "kartoffeln"],
recipeSlugs: [],
priority: 75,
},
// --- Frankrike (FR) ---
{
id: "fr-reveillon-noel",
slug: "reveillon-de-noel",
nameSv: "Réveillon de Noël",
nameLocalized: "Réveillon de Noël",
market: "FR",
dateRule: { kind: "fixed", monthDay: "12-24" },
leadDays: 21,
foodTags: ["huitres", "foie-gras", "chapon", "marrons", "buche"],
recipeSlugs: [],
priority: 100,
},
{
id: "fr-saint-sylvestre",
slug: "saint-sylvestre",
nameSv: "Saint-Sylvestre",
nameLocalized: "Saint-Sylvestre",
market: "FR",
dateRule: { kind: "fixed", monthDay: "12-31" },
leadDays: 7,
foodTags: ["foie-gras", "huitres", "fruits-de-mer", "saumon-fume", "champagne"],
recipeSlugs: [],
priority: 90,
},
{
id: "fr-epiphanie",
slug: "epiphanie",
nameSv: "Épiphanie",
nameLocalized: "Épiphanie",
market: "FR",
dateRule: { kind: "fixed", monthDay: "01-06" },
leadDays: 5,
foodTags: ["galette-des-rois", "frangipane", "feve", "brioche"],
recipeSlugs: [],
priority: 80,
},
{
id: "fr-chandeleur",
slug: "chandeleur",
nameSv: "Chandeleur",
nameLocalized: "Chandeleur",
market: "FR",
dateRule: { kind: "fixed", monthDay: "02-02" },
leadDays: 3,
foodTags: ["crepes", "sucre", "citron", "confiture"],
recipeSlugs: [],
priority: 70,
},
{
id: "fr-paques",
slug: "paques",
nameSv: "Pâques",
nameLocalized: "Pâques",
market: "FR",
dateRule: { kind: "computed", algorithm: "easter" },
leadDays: 10,
foodTags: ["agneau", "gigot", "oeufs-chocolat", "chocolat"],
recipeSlugs: [],
priority: 90,
},
{
id: "fr-mardi-gras",
slug: "mardi-gras",
nameSv: "Mardi Gras",
nameLocalized: "Mardi Gras",
market: "FR",
dateRule: { kind: "easter-offset", days: -47 },
leadDays: 3,
foodTags: ["beignets", "bugnes", "merveilles", "gaufres"],
recipeSlugs: [],
priority: 70,
},
// --- Nederländerna (NL) ---
{
id: "nl-sinterklaas",
slug: "sinterklaas",
nameSv: "Sinterklaas",
nameLocalized: "Sinterklaas",
market: "NL",
dateRule: { kind: "fixed", monthDay: "12-05" },
leadDays: 14,
foodTags: ["kruidnoten", "pepernoten", "chocoladeletter", "speculaas", "banketstaaf"],
recipeSlugs: [],
priority: 95,
},
{
id: "nl-kerst",
slug: "kerst",
nameSv: "Kerst",
nameLocalized: "Kerst",
market: "NL",
dateRule: { kind: "fixed", monthDay: "12-25" },
leadDays: 14,
foodTags: ["gourmet", "rollade", "kerststol", "kerstkransjes"],
recipeSlugs: [],
priority: 100,
},
{
id: "nl-oud-en-nieuw",
slug: "oud-en-nieuw",
nameSv: "Oud en Nieuw",
nameLocalized: "Oud en Nieuw",
market: "NL",
dateRule: { kind: "fixed", monthDay: "12-31" },
leadDays: 5,
foodTags: ["oliebollen", "appelflappen", "appelbeignets"],
recipeSlugs: [],
priority: 90,
},
{
id: "nl-pasen",
slug: "pasen",
nameSv: "Pasen",
nameLocalized: "Pasen",
market: "NL",
dateRule: { kind: "computed", algorithm: "easter" },
leadDays: 10,
foodTags: ["eieren", "paasstol", "paasbrood", "lamsvlees"],
recipeSlugs: [],
priority: 85,
},
{
id: "nl-koningsdag",
slug: "koningsdag",
nameSv: "Koningsdag",
nameLocalized: "Koningsdag",
market: "NL",
dateRule: { kind: "fixed", monthDay: "04-27" },
leadDays: 5,
foodTags: ["tompouce", "oranje", "gebak"],
recipeSlugs: [],
priority: 65,
},
];