mots-clés recherchés dans les noms de catégories (minuscule, accents inclus). * * @return array> */ private static function needles(): array { return array( Filieres::MOBILIER => array( 'meuble', 'mobilier', 'canap', 'fauteuil', 'matelas', 'literie', 'armoire' ), Filieres::EEE => array( 'electro', 'électro', 'electriqu', 'électriqu', 'electroniqu', 'électroniqu', 'ordinateur', 'telephone', 'téléphone', 'ampoule' ), Filieres::TEXTILE => array( 'textile', 'vetement', 'vêtement', 'linge', 'chaussure' ), ); } /** * Slugs des filières premium détectées dans une liste de noms de catégories. * * @param array $category_names Noms de catégories de la boutique. * @return array Slugs de filières (Filieres::*), sans doublon, dans l'ordre du registre. */ public static function detect_slugs( array $category_names ): array { $haystack = ''; foreach ( $category_names as $name ) { $name = (string) $name; $haystack .= ' ' . ( function_exists( 'mb_strtolower' ) ? mb_strtolower( $name, 'UTF-8' ) : strtolower( $name ) ); } $found = array(); foreach ( self::needles() as $filiere => $needles ) { foreach ( $needles as $needle ) { if ( false !== strpos( $haystack, $needle ) ) { $found[] = $filiere; break; } } } return $found; } /** * Détection enrichie pour l'UI : slug => « libellé — éco-organisme ». * * @param array $category_names Noms de catégories de la boutique. * @return array */ public static function detect_premium_filieres( array $category_names ): array { $all = Filieres::all(); $out = array(); foreach ( self::detect_slugs( $category_names ) as $slug ) { $out[ $slug ] = $all[ $slug ]['label'] . ' — ' . $all[ $slug ]['eco_organisme']; } return $out; } /** * Évalue la qualification PQAS d'une boutique (redéfinie revue 08 #13). * * - `qualified` = filière premium détectée (mobilier/EEE/textile) **OU** ≥1 allégation à risque * (greenwashing, `$at_risk > 0`) → la qualification capte désormais le **segment recadré ADR 0013** * (toute marque DTC à risque d'allégation), pas seulement les filières par nom de catégorie. * - `display_live` = l'affichage AGEC est **réellement rendu** sur ≥1 fiche (vraie couverture), pas un * simple booléen de réglage → la moitié « activated » de PQAS. * - `pqas` = `display_live` **ET** `qualified` (boutique active **et** premium-qualifiée). * * @param array $category_names Noms de catégories de la boutique. * @param bool $display_live Affichage AGEC rendu sur ≥1 produit publié. * @param int $at_risk Nombre de produits avec une allégation à risque (GreenwashingScan). * @return array{qualified:bool, filieres:array, at_risk:int, display_live:bool, pqas:bool} */ public static function evaluate( array $category_names, bool $display_live, int $at_risk = 0 ): array { $filieres = self::detect_slugs( $category_names ); $at_risk = max( 0, $at_risk ); $qualified = array() !== $filieres || $at_risk > 0; return array( 'qualified' => $qualified, 'filieres' => $filieres, 'at_risk' => $at_risk, 'display_live' => $display_live, 'pqas' => $display_live && $qualified, ); } }