isset( $_GET['catalog_map'] ) ? sanitize_text_field( wp_unslash( $_GET['catalog_map'] ) ) : '', 'catalog_map_edit' => isset( $_GET['catalog_map_edit'] ) ? sanitize_text_field( wp_unslash( $_GET['catalog_map_edit'] ) ) : '', 'setup_done' => isset( $_GET['setup_done'] ) ? sanitize_text_field( wp_unslash( $_GET['setup_done'] ) ) : '', 'catalog_updated' => isset( $_GET['catalog_updated'] ) ? sanitize_text_field( wp_unslash( $_GET['catalog_updated'] ) ) : '', ); // phpcs:enable WordPress.Security.NonceVerification.Recommended $has_pending_plan = $plan && 'pending' === $plan->status; $has_report = ! empty( $report ); $catalog_session = $catalog_session ?? null; $catalog_import_result = $catalog_import_result ?? null; $catalog_overwrite = $catalog_overwrite ?? false; $assistant_mode = ! empty( $assistant_mode ); if ( $catalog_session && ( ! empty( $tl_query_args['catalog_map'] ) || ! empty( $tl_query_args['catalog_map_edit'] ) ) ) { Torlann_Catalog_Session::set_step( 'mapping' ); $catalog_session = Torlann_Catalog_Session::get(); } $setup_completed = Torlann_Store_Setup::is_setup_completed(); $show_catalog_flow = $catalog_session && ! $catalog_import_result && ! $has_pending_plan && ! $has_report; $show_catalog_done = ! empty( $catalog_import_result ); // Ouvrir la session photos avant le calcul de phase (sinon barre = « Import terminé »). if ( $show_catalog_done && is_array( $catalog_import_result ) && ! Torlann_Catalog_Images::is_active() && Torlann_Catalog_Images::import_has_pending_photos( $catalog_import_result ) ) { Torlann_Catalog_Images::ensure_pending_session(); } // Photos actives = priorité, même sans transient d’import (lien « Ajouter des photos »). $show_images_step = Torlann_Catalog_Images::is_active() && ! $show_catalog_flow; $setup_session = Torlann_Store_Setup::get_session(); // Session « done » obsolète → hub (l’écran de fin n’est plus à montrer). if ( $setup_completed && is_array( $setup_session ) && 'done' === ( $setup_session['step'] ?? '' ) && ! Torlann_Store_Setup::should_show_completion_once() && empty( $catalog_import_result['store_config']['applied'] ) && empty( $tl_query_args['setup_done'] ) ) { Torlann_Store_Setup::clear_session(); $setup_session = null; } $configure_done = ! empty( $catalog_import_result['store_config']['applied'] ) || ( is_array( $setup_session ) && 'done' === ( $setup_session['step'] ?? '' ) ) || ! empty( $tl_query_args['setup_done'] ); // Priorité : import → photos → setup actif → audit/plan → écran fin (1×) → hub ou welcome. $resume_store_setup = Torlann_Store_Setup::is_active() && ! $show_images_step && ! $show_catalog_done && ! $show_catalog_flow && ! $has_pending_plan && ! $has_report && ! $assistant_mode; $show_store_setup = ( Torlann_Store_Setup::is_active() && ( $show_catalog_done || ! empty( $setup_only ) ) && ! $show_images_step ) || $resume_store_setup; // Si setup_continue / setup_only : forcer le wizard compte même après un statut « ready » erroné. if ( ! empty( $setup_only ) && Torlann_Store_Setup::is_active() && ! $show_images_step ) { $show_store_setup = true; } $needs_configure = $show_catalog_done && ! $configure_done && ! $show_store_setup && ! $show_images_step && ! $setup_completed; $show_setup_completion = ( Torlann_Store_Setup::should_show_completion_once() || ! empty( $tl_query_args['setup_done'] ) ) && ! $show_catalog_flow && ! $show_images_step && ! $show_store_setup && ! $has_pending_plan && ! $has_report && ! $assistant_mode; // Fin d’assistant prioritaire sur le récap import (sinon l’écran « Bravo » disparaît). if ( $show_setup_completion ) { $show_catalog_done = false; } // L’étape photos prime sur l’écran « boutique prête » (lien checklist ou reprise). if ( $show_images_step ) { $show_setup_completion = false; } // Fin de sync hub (après photos) : écran dédié avant le hub. $show_catalog_updated = $setup_completed && ! empty( $tl_query_args['catalog_updated'] ) && ! $show_catalog_flow && ! $show_catalog_done && ! $show_images_step && ! $show_store_setup && ! $show_setup_completion && ! $has_pending_plan && ! $has_report && ! $assistant_mode; // Hub uniquement si le setup est réellement terminé (status ready) — pas seulement parce qu’il y a des produits. $show_catalog_hub = $setup_completed && ! $show_catalog_flow && ! $show_catalog_done && ! $show_images_step && ! $show_store_setup && ! $show_setup_completion && ! $show_catalog_updated && ! $has_pending_plan && ! $has_report && ! $assistant_mode && ! $needs_configure; // Première utilisation / setup incomplet : écran Bienvenue (même s’il reste des produits démo). $show_choice = ! $setup_completed && ! $show_catalog_flow && ! $show_catalog_done && ! $show_store_setup && ! $show_images_step && ! $needs_configure && ! $has_pending_plan && ! $has_report && ! $assistant_mode && ! $show_setup_completion && ! $show_catalog_updated && ! $show_catalog_hub; $show_compose = ! $show_catalog_flow && ! $show_catalog_done && ! $has_pending_plan && ! $has_report && $assistant_mode; $show_audit_results = ! empty( $audit ); if ( $show_setup_completion ) { Torlann_Store_Setup::consume_completion_once(); add_action( 'shutdown', static function () { Torlann_Store_Setup::clear_completion_markers(); delete_transient( 'torlann_catalog_result_' . get_current_user_id() ); } ); } $intent_placeholder = __('Ex.: I am a baker and I want to sell my breads online with local delivery.', 'torlann'); // Prefill après POST (formulaire agent), uniquement si le nonce est valide. $intent_value = ''; if ( isset( $_POST['intent'], $_POST['_wpnonce'] ) && wp_verify_nonce( sanitize_text_field( wp_unslash( $_POST['_wpnonce'] ) ), 'torlann_agent' ) ) { $intent_value = sanitize_textarea_field( wp_unslash( $_POST['intent'] ) ); } $plan_activity_label = ''; if ( $plan && ! empty( $plan->context_snapshot['blueprint']['activity_label'] ) ) { $plan_activity_label = $plan->context_snapshot['blueprint']['activity_label']; } $plan_groups = array( 'settings' => null, 'categories' => array(), 'products' => array(), ); if ( $plan ) { foreach ( $plan->steps as $index => $step ) { $tool = $step['tool'] ?? ''; $entry = array( 'index' => $index, 'step' => $step, ); if ( 'configure_store_settings' === $tool ) { $plan_groups['settings'] = $entry; } elseif ( 'create_category' === $tool ) { $plan_groups['categories'][] = $entry; } elseif ( 'create_product' === $tool ) { $plan_groups['products'][] = $entry; } } } $action_count = $plan ? count( $plan->steps ) : 0; // Phase pour la barre unique (parcours parent). $journey_phase = 'start'; if ( $show_setup_completion ) { $journey_phase = 'review'; } elseif ( $show_catalog_updated ) { $journey_phase = 'hub'; } elseif ( $show_catalog_hub ) { $journey_phase = 'hub'; } elseif ( $show_images_step ) { $journey_phase = 'photos'; } elseif ( $show_catalog_done && ! $show_store_setup ) { $journey_phase = 'done'; // sous-flux produits : récap import = étape 5/5 } elseif ( $show_catalog_flow ) { $catalog_flow_step = Torlann_Catalog_Session::normalize_step( is_array( $catalog_session ) ? $catalog_session : array() ); $journey_phase = $catalog_flow_step; } elseif ( $show_store_setup ) { $journey_phase = Torlann_Store_Setup::current_step(); } elseif ( $has_pending_plan ) { $journey_phase = 'plan'; } elseif ( $show_compose ) { $journey_phase = 'offer'; } elseif ( $show_choice ) { $journey_phase = 'start'; } if ( in_array( $journey_phase, array( 'analyze', 'mapping', 'preview', 'photos', 'done' ), true ) && ( $show_catalog_flow || $show_catalog_done || $show_images_step ) ) { $wizard_progress = Torlann_Store_Setup::products_import_progress( $journey_phase ); } else { $wizard_progress = Torlann_Store_Setup::journey_progress( $journey_phase, $setup_session ); } // Shell maquette unifié : démarrage guidé / plan / config / import catalogue / photos. // La config embarquée après import gère sa propre barre (évite le doublon). Hub = hors wizard. $catalog_embeds_setup = $show_catalog_done && $show_store_setup && ! $show_setup_completion; $use_unified_wizard = ! $catalog_embeds_setup && ! $show_catalog_hub && ! $show_catalog_updated && ( $show_choice || $show_compose || $has_pending_plan || $show_store_setup || $show_setup_completion || $show_catalog_flow || $show_images_step ); // Mode immersif première install : assistant plein écran, sans menu boutique. $is_fullpage = class_exists( 'Torlann_Store_Setup' ) && Torlann_Store_Setup::requires_immersive_assistant() && ! $show_catalog_hub && ! $show_catalog_updated; Torlann_Admin::page_header( __('Your assistant', 'torlann'), array( 'hide_header' => $is_fullpage, 'subtitle' => $is_fullpage ? '' : ( $show_setup_completion ? __('Let\'s verify your store is ready.', 'torlann') : ( $show_catalog_updated ? __('Your catalog is up to date.', 'torlann') : ( $show_catalog_hub ? __('Manage your catalog without redoing the setup.', 'torlann') : ( $show_catalog_flow || ( $show_catalog_done && ! $show_store_setup ) ? __('Configure your products, then continue with the store.', 'torlann') : __('Let\'s set up your store step by step.', 'torlann') ) ) ) ), ) ); // Éviter les doublons : flash + bandeau catalogue / récap import. $show_flash = $flash_message && ! $has_report && ! $catalog_embeds_setup && ! $show_catalog_flow && ! $show_images_step && ! $show_catalog_updated && ( $show_choice || $show_catalog_hub || $show_catalog_done || $show_store_setup || $show_setup_completion || $assistant_mode || $has_pending_plan ); if ( $show_flash ) { Torlann_Admin::notice( $flash_message, 'success' === $flash_status ? 'success' : 'error' ); } ?>