get_meta($saved_vat_field, true); if (is_string($billing_vat_number)) { $billing_vat_number = trim($billing_vat_number); } } else { // Fallback : utiliser la fonction helper pour gérer différentes variantes de clés $billing_vat_number = \ESI_PEPPOL\helpers\PEPPOL_Woo_Helper::esi_get_order_vat_number($order); } $vat_is_valid = (string) $order->get_meta('_vat_number_is_valid'); if ($billing_vat_number === '' || $vat_is_valid !== 'true') { return; } // Éviter les envois multiples si déjà traité $already_sent = $order->get_meta('_esi_peppol_sent_at'); if (!empty($already_sent)) { return; } // Construire le payload JSON à partir de la commande $payload = PEPPOL_peppol_controller::build_payload_from_order($order); /* echo '
';
        print_r($payload);
        echo '
'; die(); */ // Appel API ESIPeppol + enregistrement dans la table custom $result = PEPPOL_peppol_controller::upload_json($payload, $order_id); // Mémoriser la date d'envoi, même en cas d'échec pour éviter les boucles $order->update_meta_data('_esi_peppol_sent_at', \current_time('mysql')); $order->update_meta_data('_esi_peppol_last_peppol_status', $result['success'] ? 'success' : 'error'); $order->update_meta_data('_esi_peppol_last_http_code', $result['http_code'] ?? 0); $order->update_meta_data('_esi_peppol_last_message', $result['message'] ?? ''); $order->save(); // Log technique pour debugging if (class_exists(PEPPOL_Plugin::class)) { PEPPOL_Plugin::write_debug_file( [ 'event' => 'post_payment', 'order_id' => $order_id, 'success' => $result['success'] ?? false, 'http_code' => $result['http_code'] ?? null, 'message' => $result['message'] ?? '', 'api_response' => $result['data'] ?? null, ], $result['success'] ? 'INFO' : 'ERROR' ); } } /** * Vérifie l'état du mode de paiement BACS (virement bancaire) * et la présence de comptes bancaires configurés. * * @return array{ * installed: bool, * enabled: bool, * has_accounts: bool, * valid_accounts_count: int * } */ public static function my_check_bacs_status_and_accounts(): array { $gateways = \WC_Payment_Gateways::instance()->payment_gateways(); if (empty($gateways['bacs'])) { return [ 'installed' => false, 'enabled' => false, 'has_accounts' => false, 'valid_accounts_count'=> 0, ]; } /** @var \WC_Gateway_BACS $bacs */ $bacs = $gateways['bacs']; // 1) Est-ce que BACS est activé ? $enabled = ($bacs->enabled === 'yes'); // 2) Est-ce qu'il y a des comptes renseignés ? // Les comptes sont stockés dans l'option "woocommerce_bacs_accounts" $accounts = \get_option('woocommerce_bacs_accounts', []); $has_accounts = !empty($accounts); // Optionnel : vérifier qu'un compte contient bien les champs minimum $valid_accounts = array_filter( $accounts, static function ($acc) { return !empty($acc['account_name']) && (!empty($acc['iban']) || !empty($acc['account_number'])) && !empty($acc['bank_name']); } ); return [ 'installed' => true, 'enabled' => $enabled, 'has_accounts' => $has_accounts, 'valid_accounts_count' => count($valid_accounts), ]; } /** * Affiche un message d'avertissement dans l'admin WordPress * si BACS est activé mais qu'aucun compte bancaire n'est renseigné. * * Hooké sur admin_notices. * * @return void */ public static function maybe_show_bacs_notice(): void { if (!\current_user_can('manage_woocommerce')) { return; } $status = self::my_check_bacs_status_and_accounts(); // Si BACS n'est pas installé ou pas activé, on ne dit rien if (empty($status['installed']) || empty($status['enabled'])) { return; } // Si au moins un compte valide est configuré, pas de message if (!empty($status['valid_accounts_count'])) { return; } echo '

' . \esc_html__( 'Le mode de paiement virement bancaire (BACS) est activé mais aucun compte bancaire complet n\'est renseigné. Veuillez configurer au moins un compte (titulaire, IBAN ou numéro de compte, banque) pour afficher les instructions de paiement à vos clients.', 'esi_peppol' ) . '

'; } /** * Ajoute une colonne "Statut Peppol" dans le listing des commandes WooCommerce. * * @param array $columns Colonnes existantes. * @return array Colonnes modifiées. */ public static function add_peppol_status_column(array $columns): array { $new_columns = []; foreach ($columns as $key => $column) { $new_columns[$key] = $column; // Ajouter la colonne "Statut Peppol" après la colonne "Commande" ou "order_title" if ('order_title' === $key || 'order_number' === $key || 'order_status' === $key) { $new_columns['peppol_status'] = __('Statut Peppol', 'esi_peppol'); } } // Si aucune colonne appropriée n'a été trouvée, ajouter à la fin if (!isset($new_columns['peppol_status'])) { $new_columns['peppol_status'] = __('Statut Peppol', 'esi_peppol'); } return $new_columns; } /** * Affiche le contenu de la colonne "Statut Peppol" dans le listing des commandes. * * @param string $column Nom de la colonne. * @param int|object $order ID de la commande ou objet commande. * @return void */ public static function show_peppol_status_column(string $column, $order): void { if ('peppol_status' !== $column) { return; } // Récupérer l'ID de la commande $order_id = is_numeric($order) ? (int) $order : (is_object($order) ? $order->get_id() : 0); if (!$order_id) { echo ''; return; } // Récupérer le log Peppol associé à cette commande $log = \ESI_PEPPOL\models\PEPPOL_Main_model::get_by_order_id($order_id); if (!$log || empty($log->status)) { echo ''; return; } // Afficher le macaron cliquable vers la page de détail $detail_url = \admin_url('admin.php?page=esi-peppol-logs&detail=' . $log->id); $status_class = 'statut statut-' . \strtolower(\sanitize_html_class($log->status)); \printf( '%s', \esc_url($detail_url), \esc_attr($status_class), \esc_attr__('Voir les détails du log Peppol', 'esi_peppol'), \esc_html($log->status) ); } }