mirror of
https://github.com/R0m1k3/PleinR.git
synced 2026-10-16 19:56:57 +02:00
- Espace adhérent : /backend/espace (profil, inscriptions, droit à l'image) et /backend/espace/promotions (dépôt et suivi). Bandeau et onglets communs (EspaceHeader) avec le nombre d'offres en ligne ; la page promotions ouvre sur « Mes promotions en cours », puis le formulaire, puis les offres en attente et l'historique. Deux entrées dans le menu, titres de page dédiés, revalidation des deux chemins. - Fiche adhérent : colonne members.contact_email (migration 0013), saisie dans l'espace adhérent et la fiche staff ; la fiche publique et le JSON-LD affichent contact_email, sinon l'e-mail du compte. - VitrineImage : sans photo de couverture, le logo est contenu à ~60 % d'un cadre à hauteur fixe sur un fond du logo flouté ; le conteneur sans hauteur qui laissait le logo déborder est supprimé. - Promotions : la catégorie devient un type de produit ou de service (src/lib/promo-categories.ts, 10 groupes, ~85 entrées) pré-sélectionné depuis le métier de l'adhérent, à la place de la liste des métiers. - Tests : catégories de promo (largeur, unicité, pré-sélection pour chaque métier du référentiel). Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HDbKbJrPWweXXYSxA8MXW7
263 lines
8.3 KiB
TypeScript
263 lines
8.3 KiB
TypeScript
/**
|
|
* Catégories de promotion : le **type de produit ou de service** mis en avant,
|
|
* indépendant du métier de l'adhérent (une boulangerie peut promouvoir un
|
|
* goûter, un garage des pneus). Affichées en pastille sur la carte de la promo.
|
|
*
|
|
* Module pur, groupé pour un `<select>` à `<optgroup>`.
|
|
*/
|
|
|
|
export type PromoCategoryGroup = { label: string; items: string[] };
|
|
|
|
export const PROMO_CATEGORY_GROUPS: PromoCategoryGroup[] = [
|
|
{
|
|
label: "Alimentation",
|
|
items: [
|
|
"Pain & viennoiseries",
|
|
"Pâtisserie & desserts",
|
|
"Chocolats & confiserie",
|
|
"Viandes & charcuterie",
|
|
"Poissons & fruits de mer",
|
|
"Fruits & légumes",
|
|
"Fromages & produits laitiers",
|
|
"Épicerie & produits du terroir",
|
|
"Produits bio & locaux",
|
|
"Vins, bières & spiritueux",
|
|
"Café, thé & boissons",
|
|
"Plats préparés & traiteur",
|
|
],
|
|
},
|
|
{
|
|
label: "Restauration & sorties",
|
|
items: [
|
|
"Menu & formule du midi",
|
|
"Repas & dîner",
|
|
"Pizzas & restauration rapide",
|
|
"Brunch, goûter & glaces",
|
|
"Apéritif & afterwork",
|
|
"Soirée & animation",
|
|
],
|
|
},
|
|
{
|
|
label: "Mode & accessoires",
|
|
items: [
|
|
"Vêtements femme",
|
|
"Vêtements homme",
|
|
"Vêtements enfant",
|
|
"Lingerie & maillots",
|
|
"Chaussures",
|
|
"Sacs & maroquinerie",
|
|
"Bijoux & montres",
|
|
"Lunettes & solaires",
|
|
],
|
|
},
|
|
{
|
|
label: "Beauté & bien-être",
|
|
items: [
|
|
"Coiffure",
|
|
"Barbier",
|
|
"Soins visage & corps",
|
|
"Épilation",
|
|
"Ongles & manucure",
|
|
"Maquillage & parfums",
|
|
"Massage & spa",
|
|
"Tatouage & piercing",
|
|
],
|
|
},
|
|
{
|
|
label: "Maison & équipement",
|
|
items: [
|
|
"Meubles & décoration",
|
|
"Literie",
|
|
"Cuisine & salle de bain",
|
|
"Électroménager",
|
|
"TV, high-tech & téléphonie",
|
|
"Linge de maison & arts de la table",
|
|
"Luminaires",
|
|
"Bazar & petit équipement",
|
|
"Fleurs & plantes",
|
|
"Jardin & extérieur",
|
|
"Bricolage & outillage",
|
|
],
|
|
},
|
|
{
|
|
label: "Auto & mobilité",
|
|
items: [
|
|
"Entretien & révision",
|
|
"Pneus",
|
|
"Carrosserie & pare-brise",
|
|
"Contrôle technique",
|
|
"Carburant & lavage",
|
|
"Vélos & motos",
|
|
"Location de véhicule",
|
|
"Auto-école & permis",
|
|
],
|
|
},
|
|
{
|
|
label: "Santé, famille & animaux",
|
|
items: [
|
|
"Pharmacie & parapharmacie",
|
|
"Optique & audition",
|
|
"Puériculture & bébé",
|
|
"Jouets & jeux",
|
|
"Animalerie & alimentation animale",
|
|
"Vétérinaire & toilettage",
|
|
],
|
|
},
|
|
{
|
|
label: "Services",
|
|
items: [
|
|
"Travaux & rénovation",
|
|
"Plomberie, chauffage & électricité",
|
|
"Nettoyage & entretien",
|
|
"Aide à domicile",
|
|
"Pressing, retouches & cordonnerie",
|
|
"Photographe & vidéo",
|
|
"Informatique & réparation",
|
|
"Communication, web & impression",
|
|
"Comptabilité, juridique & conseil",
|
|
"Banque, assurance & crédit",
|
|
"Immobilier",
|
|
"Déménagement & transport",
|
|
"Événementiel & location de matériel",
|
|
],
|
|
},
|
|
{
|
|
label: "Loisirs, culture & formation",
|
|
items: [
|
|
"Sport & fitness",
|
|
"Articles de sport",
|
|
"Livres, presse & papeterie",
|
|
"Culture, arts & spectacles",
|
|
"Cours & formation",
|
|
"Voyages & séjours",
|
|
"Hôtel & hébergement",
|
|
],
|
|
},
|
|
{
|
|
label: "Offres spéciales",
|
|
items: [
|
|
"Offre de bienvenue",
|
|
"Carte de fidélité",
|
|
"Parrainage",
|
|
"Déstockage & fin de série",
|
|
"Nouveauté",
|
|
"Autre",
|
|
],
|
|
},
|
|
];
|
|
|
|
export const PROMO_CATEGORIES: string[] = PROMO_CATEGORY_GROUPS.flatMap((g) => g.items);
|
|
|
|
/** Catégorie de promotion proposée par défaut selon le métier de l'adhérent. */
|
|
const DEFAULT_BY_MEMBER_CATEGORY: Record<string, string> = {
|
|
alimentation: "Épicerie & produits du terroir",
|
|
"epicerie-fine": "Épicerie & produits du terroir",
|
|
supermarche: "Épicerie & produits du terroir",
|
|
boulangerie: "Pain & viennoiseries",
|
|
"boucherie-charcuterie": "Viandes & charcuterie",
|
|
poissonnerie: "Poissons & fruits de mer",
|
|
primeur: "Fruits & légumes",
|
|
fromagerie: "Fromages & produits laitiers",
|
|
cave: "Vins, bières & spiritueux",
|
|
"brasserie-artisanale": "Vins, bières & spiritueux",
|
|
chocolaterie: "Chocolats & confiserie",
|
|
"glacier-salon-de-the": "Brunch, goûter & glaces",
|
|
traiteur: "Plats préparés & traiteur",
|
|
restauration: "Menu & formule du midi",
|
|
pizzeria: "Pizzas & restauration rapide",
|
|
"restauration-rapide": "Pizzas & restauration rapide",
|
|
"cafe-bar": "Apéritif & afterwork",
|
|
"mode-beaute": "Vêtements femme",
|
|
"mode-vetements": "Vêtements femme",
|
|
lingerie: "Lingerie & maillots",
|
|
"vetements-enfants": "Vêtements enfant",
|
|
"chaussures-maroquinerie": "Chaussures",
|
|
bijouterie: "Bijoux & montres",
|
|
coiffure: "Coiffure",
|
|
barbier: "Barbier",
|
|
esthetique: "Soins visage & corps",
|
|
onglerie: "Ongles & manucure",
|
|
parfumerie: "Maquillage & parfums",
|
|
"bien-etre": "Massage & spa",
|
|
optique: "Lunettes & solaires",
|
|
tatouage: "Tatouage & piercing",
|
|
"bazar-discount": "Bazar & petit équipement",
|
|
decoration: "Meubles & décoration",
|
|
cuisiniste: "Cuisine & salle de bain",
|
|
literie: "Literie",
|
|
"arts-de-la-table": "Linge de maison & arts de la table",
|
|
"electromenager-multimedia": "Électroménager",
|
|
fleuriste: "Fleurs & plantes",
|
|
jardinerie: "Jardin & extérieur",
|
|
"bricolage-jardinage": "Bricolage & outillage",
|
|
animalerie: "Animalerie & alimentation animale",
|
|
artisanat: "Meubles & décoration",
|
|
batiment: "Travaux & rénovation",
|
|
architecte: "Travaux & rénovation",
|
|
maconnerie: "Travaux & rénovation",
|
|
"couverture-toiture": "Travaux & rénovation",
|
|
plomberie: "Plomberie, chauffage & électricité",
|
|
electricite: "Plomberie, chauffage & électricité",
|
|
"isolation-energie": "Travaux & rénovation",
|
|
menuiserie: "Travaux & rénovation",
|
|
"serrurerie-metallerie": "Travaux & rénovation",
|
|
"carrelage-sols": "Travaux & rénovation",
|
|
peinture: "Travaux & rénovation",
|
|
paysagiste: "Jardin & extérieur",
|
|
"depannage-multiservices": "Travaux & rénovation",
|
|
automobile: "Entretien & révision",
|
|
carrosserie: "Carrosserie & pare-brise",
|
|
"controle-technique": "Contrôle technique",
|
|
"station-service-lavage": "Carburant & lavage",
|
|
"location-vehicules": "Location de véhicule",
|
|
"cycles-motos": "Vélos & motos",
|
|
"auto-ecole": "Auto-école & permis",
|
|
"taxi-vtc": "Déménagement & transport",
|
|
sante: "Pharmacie & parapharmacie",
|
|
medical: "Pharmacie & parapharmacie",
|
|
audioprothese: "Optique & audition",
|
|
veterinaire: "Vétérinaire & toilettage",
|
|
"banque-assurance": "Banque, assurance & crédit",
|
|
assurance: "Banque, assurance & crédit",
|
|
"courtier-credit": "Banque, assurance & crédit",
|
|
immobilier: "Immobilier",
|
|
"diagnostic-immobilier": "Immobilier",
|
|
services: "Autre",
|
|
"services-a-la-personne": "Aide à domicile",
|
|
"pressing-retouches": "Pressing, retouches & cordonnerie",
|
|
photographe: "Photographe & vidéo",
|
|
"pompes-funebres": "Autre",
|
|
"agence-voyages": "Voyages & séjours",
|
|
demenagement: "Déménagement & transport",
|
|
comptabilite: "Comptabilité, juridique & conseil",
|
|
juridique: "Comptabilité, juridique & conseil",
|
|
conseil: "Comptabilité, juridique & conseil",
|
|
communication: "Communication, web & impression",
|
|
"imprimerie-enseignes": "Communication, web & impression",
|
|
informatique: "Informatique & réparation",
|
|
nettoyage: "Nettoyage & entretien",
|
|
transport: "Déménagement & transport",
|
|
securite: "Autre",
|
|
coworking: "Autre",
|
|
"interim-rh": "Autre",
|
|
"recyclage-dechets": "Autre",
|
|
"librairie-papeterie": "Livres, presse & papeterie",
|
|
"tabac-presse": "Livres, presse & papeterie",
|
|
"jouets-puericulture": "Jouets & jeux",
|
|
"sport-loisirs": "Sport & fitness",
|
|
"articles-de-sport": "Articles de sport",
|
|
fitness: "Sport & fitness",
|
|
"culture-arts": "Culture, arts & spectacles",
|
|
"education-formation": "Cours & formation",
|
|
"tourisme-hotellerie": "Hôtel & hébergement",
|
|
evenementiel: "Événementiel & location de matériel",
|
|
industrie: "Autre",
|
|
agriculture: "Produits bio & locaux",
|
|
"partenaire-institutionnel": "Autre",
|
|
};
|
|
|
|
export function defaultPromoCategory(memberCategorySlug: string | null | undefined): string {
|
|
const found = memberCategorySlug ? DEFAULT_BY_MEMBER_CATEGORY[memberCategorySlug] : undefined;
|
|
return found && PROMO_CATEGORIES.includes(found) ? found : "Autre";
|
|
}
|