710 lines
26 KiB
PHP
710 lines
26 KiB
PHP
<?php
|
|
|
|
namespace ESI_PEPPOL\controllers;
|
|
|
|
use ESI_PEPPOL\models\PEPPOL_Main_model;
|
|
|
|
class PEPPOL_Plugin {
|
|
|
|
|
|
public function init() {
|
|
$this->load_actions();
|
|
}
|
|
|
|
/**
|
|
* Méthode appelée lors de l'activation du plugin.
|
|
*
|
|
* Elle délègue au modèle principal la création de la table
|
|
* `esi_peppol_invoices`.
|
|
*
|
|
* @return void
|
|
*/
|
|
public static function activate(): void {
|
|
// Création / mise à jour de la table principale des factures
|
|
PEPPOL_Main_model::create_table();
|
|
}
|
|
|
|
public function desactivate() {
|
|
|
|
}
|
|
|
|
public static function register_routes() {
|
|
|
|
}
|
|
|
|
public function load_actions() {
|
|
// Enregistrement des hooks WooCommerce
|
|
if (class_exists(\ESI_PEPPOL\controllers\PEPPOL_Woocommerce_controller::class)) {
|
|
\ESI_PEPPOL\controllers\PEPPOL_Woocommerce_controller::register_hooks();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Enregistre le menu et les sous-menus dans l'admin WordPress.
|
|
*
|
|
* @return void
|
|
*/
|
|
public static function add_admin_menu(): void {
|
|
// Page principale du plugin
|
|
add_menu_page(
|
|
__('ESI Peppol', 'esi_peppol'),
|
|
__('ESI Peppol', 'esi_peppol'),
|
|
'manage_options',
|
|
'esi-peppol',
|
|
[self::class, 'render_dashboard_page'],
|
|
'dashicons-migrate',
|
|
56
|
|
);
|
|
|
|
// Sous-menus (cibles des boutons de la page d'accueil)
|
|
add_submenu_page(
|
|
'esi-peppol',
|
|
__('Configuration', 'esi_peppol'),
|
|
__('Configuration', 'esi_peppol'),
|
|
'manage_options',
|
|
'esi-peppol-settings',
|
|
[self::class, 'render_settings_page']
|
|
);
|
|
|
|
add_submenu_page(
|
|
'esi-peppol',
|
|
__('Journal', 'esi_peppol'),
|
|
__('Journal', 'esi_peppol'),
|
|
'manage_options',
|
|
'esi-peppol-logs',
|
|
[self::class, 'render_logs_page']
|
|
);
|
|
}
|
|
|
|
public static function load_filters() {
|
|
|
|
}
|
|
|
|
public function load_shortcodes() {
|
|
|
|
}
|
|
|
|
public function load_frontend_assets() {
|
|
self::enqueue_admin_assets();
|
|
self::enqueue_front_assets();
|
|
}
|
|
|
|
public function load_admin_assets() {
|
|
|
|
}
|
|
|
|
/**
|
|
* Page d'accueil du plugin (dashboard interne ESI Peppol).
|
|
*
|
|
* Contient un texte explicatif et deux boutons vers les sous-menus.
|
|
*
|
|
* @return void
|
|
*/
|
|
public static function render_dashboard_page(): void {
|
|
if (!current_user_can('manage_options')) {
|
|
wp_die(esc_html__('Vous n\'avez pas les permissions nécessaires pour accéder à cette page.', 'esi_peppol'));
|
|
}
|
|
|
|
$settings_url = admin_url('admin.php?page=esi-peppol-settings');
|
|
$logs_url = admin_url('admin.php?page=esi-peppol-logs');
|
|
|
|
$template = ESI_PEPPOL_DIR . 'templates/admin/dashboard.php';
|
|
|
|
if (file_exists($template)) {
|
|
/** @noinspection PhpIncludeInspection */
|
|
include $template;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Page de configuration (stub pour l'instant).
|
|
*
|
|
* @return void
|
|
*/
|
|
public static function render_settings_page(): void {
|
|
if (!current_user_can('manage_options')) {
|
|
wp_die(esc_html__('Vous n\'avez pas les permissions nécessaires pour accéder à cette page.', 'esi_peppol'));
|
|
}
|
|
|
|
$notice = null;
|
|
$error = null;
|
|
|
|
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
|
$action = isset($_POST['esi_peppol_action'])
|
|
? sanitize_text_field(wp_unslash($_POST['esi_peppol_action']))
|
|
: '';
|
|
|
|
if (!isset($_POST['esi_peppol_nonce']) || !wp_verify_nonce(sanitize_text_field(wp_unslash($_POST['esi_peppol_nonce'])), 'esi_peppol_save_settings')) {
|
|
$error = __('Sécurité : nonce invalide.', 'esi_peppol');
|
|
} else {
|
|
$api_key = isset($_POST['esi_peppol_api_key']) ? sanitize_text_field(wp_unslash($_POST['esi_peppol_api_key'])) : '';
|
|
$password = isset($_POST['esi_peppol_password']) ? sanitize_text_field(wp_unslash($_POST['esi_peppol_password'])) : '';
|
|
$email = isset($_POST['esi_peppol_email']) ? sanitize_email(wp_unslash($_POST['esi_peppol_email'])) : '';
|
|
$logo_email_id = isset($_POST['esi_peppol_logo_email_id']) ? absint(wp_unslash($_POST['esi_peppol_logo_email_id'])) : 0;
|
|
|
|
// Sauvegarde systématique des options
|
|
update_option('esi_peppol_api_key', $api_key);
|
|
update_option('esi_peppol_password', $password);
|
|
update_option('esi_peppol_email', $email);
|
|
update_option('esi_peppol_logo_email_id', $logo_email_id);
|
|
|
|
if ($action === 'save') {
|
|
$notice = __('Paramètres enregistrés avec succès.', 'esi_peppol');
|
|
} elseif ($action === 'test') {
|
|
// Ici on pourrait appeler un endpoint de "ping" de l\'API ESIPeppol.
|
|
// Pour l\'instant : simple message de succès basé sur la présence des credentials.
|
|
if ($api_key && $password) {
|
|
$notice = __('Test de connexion simulé : les identifiants semblent corrects (vérification API réelle à implémenter).', 'esi_peppol');
|
|
} else {
|
|
$error = __('Veuillez renseigner l\'API Key et le Password avant de tester la connexion.', 'esi_peppol');
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
$template = ESI_PEPPOL_DIR . 'templates/admin/settings.php';
|
|
|
|
if (file_exists($template)) {
|
|
/** @noinspection PhpIncludeInspection */
|
|
include $template;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Page de journal / logs (stub pour l'instant).
|
|
*
|
|
* @return void
|
|
*/
|
|
public static function render_logs_page(): void {
|
|
if (!current_user_can('manage_options')) {
|
|
wp_die(esc_html__('Vous n\'avez pas les permissions nécessaires pour accéder à cette page.', 'esi_peppol'));
|
|
}
|
|
|
|
// Récupération des dernières lignes de la table custom
|
|
$rows = PEPPOL_Main_model::get_recent(50);
|
|
|
|
$template = ESI_PEPPOL_DIR . 'templates/admin/logs.php';
|
|
|
|
if (file_exists($template)) {
|
|
/** @noinspection PhpIncludeInspection */
|
|
include $template;
|
|
}
|
|
}
|
|
|
|
public static function enqueue_admin_assets() {
|
|
$screen = function_exists('get_current_screen') ? get_current_screen() : null;
|
|
|
|
// Ne charger les assets que sur les pages du plugin
|
|
$is_peppol_page = isset($_GET['page']) && strpos((string) $_GET['page'], 'esi-peppol') === 0; // phpcs:ignore WordPress.Security.NonceVerification.Recommended
|
|
|
|
if (!$is_peppol_page && $screen && strpos((string) $screen->base, 'esi-peppol') === false) {
|
|
return;
|
|
}
|
|
|
|
$suffix = defined('SCRIPT_DEBUG') && SCRIPT_DEBUG ? '' : '.min';
|
|
|
|
// Styles admin généraux
|
|
wp_enqueue_style(
|
|
'esi-peppol-admin',
|
|
ESI_PEPPOL_URL . 'assets/css/admin.css',
|
|
[],
|
|
ESI_PEPPOL_VERSION
|
|
);
|
|
|
|
// DataTables (utilisé pour le tableau du journal des échanges)
|
|
wp_enqueue_style(
|
|
'esi-peppol-datatables',
|
|
ESI_PEPPOL_URL . 'assets/css/datatables' . $suffix . '.css',
|
|
['esi-peppol-admin'],
|
|
ESI_PEPPOL_VERSION
|
|
);
|
|
|
|
wp_enqueue_script(
|
|
'esi-peppol-datatables',
|
|
ESI_PEPPOL_URL . 'assets/js/datatables' . $suffix . '.js',
|
|
['jquery'],
|
|
ESI_PEPPOL_VERSION,
|
|
true
|
|
);
|
|
|
|
// Enqueue wp.media pour la gestion de la médiathèque (logo email)
|
|
wp_enqueue_media();
|
|
|
|
// Script admin principal, dépendant de DataTables
|
|
wp_enqueue_script(
|
|
'esi-peppol-admin',
|
|
ESI_PEPPOL_URL . 'assets/js/admin.js',
|
|
['jquery', 'esi-peppol-datatables'],
|
|
ESI_PEPPOL_VERSION,
|
|
true
|
|
);
|
|
|
|
wp_localize_script(
|
|
'esi-peppol-admin',
|
|
'esiPeppolAdmin',
|
|
[
|
|
'ajax_url' => admin_url('admin-ajax.php'),
|
|
'nonce' => wp_create_nonce('esi_peppol_test_connection'),
|
|
'logs_nonce_resend' => wp_create_nonce('esi_peppol_resend_invoice'),
|
|
'logs_nonce_status' => wp_create_nonce('esi_peppol_check_invoice_status'),
|
|
'i18n_missing' => __('Veuillez renseigner l\'API Key et le Password avant de tester la connexion.', 'esi_peppol'),
|
|
'i18n_success' => __('Connexion réussie à l\'API ESIPeppol.', 'esi_peppol'),
|
|
'i18n_error' => __('La connexion a échoué. Veuillez vérifier vos identifiants.', 'esi_peppol'),
|
|
'i18n_network' => __('Erreur de communication avec le serveur WordPress.', 'esi_peppol'),
|
|
'i18n_logs_ok_title' => __('OK', 'esi_peppol'),
|
|
'i18n_logs_ko_title' => __('Pas OK', 'esi_peppol'),
|
|
'i18n_logs_resend_ok' => __('Document renvoyé avec succès à l\'API ESIPeppol.', 'esi_peppol'),
|
|
'i18n_logs_resend_ko' => __('L\'envoi du document a échoué.', 'esi_peppol'),
|
|
'i18n_logs_status_lbl' => __('Statut actuel du document', 'esi_peppol'),
|
|
'i18n_logs_detail_lbl' => __('Détail retour API', 'esi_peppol'),
|
|
]
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Handler AJAX pour le test de connexion à l'API ESIPeppol.
|
|
*
|
|
* @return void
|
|
*/
|
|
public static function ajax_test_connection(): void {
|
|
if (!check_ajax_referer('esi_peppol_test_connection', 'nonce', false)) {
|
|
wp_send_json_error(
|
|
[
|
|
'message' => __('Sécurité : nonce invalide.', 'esi_peppol'),
|
|
],
|
|
400
|
|
);
|
|
}
|
|
|
|
if (!current_user_can('manage_options')) {
|
|
wp_send_json_error(
|
|
[
|
|
'message' => __('Vous n\'avez pas les permissions nécessaires pour effectuer ce test.', 'esi_peppol'),
|
|
],
|
|
403
|
|
);
|
|
}
|
|
|
|
$api_key = isset($_POST['api_key']) ? sanitize_text_field(wp_unslash($_POST['api_key'])) : ''; // phpcs:ignore WordPress.Security.NonceVerification.Missing
|
|
$password = isset($_POST['password']) ? sanitize_text_field(wp_unslash($_POST['password'])) : ''; // phpcs:ignore WordPress.Security.NonceVerification.Missing
|
|
|
|
if ($api_key === '' || $password === '') {
|
|
wp_send_json_error(
|
|
[
|
|
'message' => __('Veuillez renseigner l\'API Key et le Password avant de tester la connexion.', 'esi_peppol'),
|
|
],
|
|
400
|
|
);
|
|
}
|
|
|
|
$result = \ESI_PEPPOL\controllers\PEPPOL_peppol_controller::status_with_credentials($api_key, $password);
|
|
|
|
if (!empty($result['success'])) {
|
|
$company = '';
|
|
if (is_array($result['data'] ?? null) && isset($result['data']['company'])) {
|
|
$company = (string) $result['data']['company'];
|
|
}
|
|
|
|
$message = $company
|
|
? sprintf(__('Connexion réussie. Entreprise: %s', 'esi_peppol'), $company)
|
|
: __('Connexion réussie à l\'API ESIPeppol.', 'esi_peppol');
|
|
|
|
wp_send_json_success(
|
|
[
|
|
'message' => $message,
|
|
'http_code' => $result['http_code'] ?? 200,
|
|
]
|
|
);
|
|
}
|
|
|
|
$error_message = $result['message'] ?? '';
|
|
if ($error_message === '' && is_array($result['data'] ?? null) && isset($result['data']['message'])) {
|
|
$error_message = (string) $result['data']['message'];
|
|
}
|
|
|
|
if ($error_message === '') {
|
|
$error_message = __('La connexion a échoué. Veuillez vérifier vos identifiants.', 'esi_peppol');
|
|
}
|
|
|
|
wp_send_json_error(
|
|
[
|
|
'message' => $error_message,
|
|
'http_code' => $result['http_code'] ?? 0,
|
|
]
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Handler AJAX pour renvoyer un document/facture vers l'API ESIPeppol
|
|
* à partir d'un ID de commande WooCommerce.
|
|
*
|
|
* @return void
|
|
*/
|
|
public static function ajax_resend_invoice(): void {
|
|
if (!check_ajax_referer('esi_peppol_resend_invoice', 'nonce', false)) {
|
|
wp_send_json_error(
|
|
[
|
|
'message' => __('Sécurité : nonce invalide.', 'esi_peppol'),
|
|
],
|
|
400
|
|
);
|
|
}
|
|
|
|
if (!current_user_can('manage_woocommerce') && !current_user_can('manage_options')) {
|
|
wp_send_json_error(
|
|
[
|
|
'message' => __('Vous n\'avez pas les permissions nécessaires pour effectuer cette action.', 'esi_peppol'),
|
|
],
|
|
403
|
|
);
|
|
}
|
|
|
|
$order_id = isset($_POST['order_id']) ? (int) $_POST['order_id'] : 0; // phpcs:ignore WordPress.Security.NonceVerification.Missing
|
|
|
|
if ($order_id <= 0) {
|
|
wp_send_json_error(
|
|
[
|
|
'message' => __('Identifiant de commande invalide.', 'esi_peppol'),
|
|
],
|
|
400
|
|
);
|
|
}
|
|
|
|
$order = wc_get_order($order_id);
|
|
|
|
if (!$order instanceof \WC_Order) {
|
|
wp_send_json_error(
|
|
[
|
|
'message' => __('Commande introuvable.', 'esi_peppol'),
|
|
],
|
|
404
|
|
);
|
|
}
|
|
|
|
// Reconstruire le payload et renvoyer le document via l'API ESIPeppol
|
|
$payload = \ESI_PEPPOL\controllers\PEPPOL_peppol_controller::build_payload_from_order($order);
|
|
$result = \ESI_PEPPOL\controllers\PEPPOL_peppol_controller::upload_json($payload, $order_id);
|
|
|
|
// Mettre à jour quelques métadonnées sur la commande pour le suivi
|
|
$order->update_meta_data('_esi_peppol_last_manual_action', 'resend');
|
|
$order->update_meta_data('_esi_peppol_last_peppol_status', !empty($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();
|
|
|
|
$detail_message = '';
|
|
if (is_array($result['data'] ?? null) && isset($result['data']['message'])) {
|
|
$detail_message = (string) $result['data']['message'];
|
|
}
|
|
|
|
if ($detail_message === '' && isset($result['message'])) {
|
|
$detail_message = (string) $result['message'];
|
|
}
|
|
|
|
$payload_response = [
|
|
'success' => !empty($result['success']),
|
|
'message' => !empty($result['success'])
|
|
? __('Document renvoyé avec succès à l\'API ESIPeppol.', 'esi_peppol')
|
|
: __('L\'envoi du document a échoué.', 'esi_peppol'),
|
|
'detail' => $detail_message,
|
|
'http_code' => $result['http_code'] ?? 0,
|
|
];
|
|
|
|
if (!empty($result['success'])) {
|
|
wp_send_json_success($payload_response);
|
|
}
|
|
|
|
wp_send_json_error($payload_response, $result['http_code'] ?? 400);
|
|
}
|
|
|
|
/**
|
|
* Handler AJAX pour consulter le statut courant d'un document Peppol
|
|
* à partir de l'ID de commande (lecture depuis la table custom).
|
|
*
|
|
* @return void
|
|
*/
|
|
public static function ajax_check_invoice_status(): void {
|
|
if (!check_ajax_referer('esi_peppol_check_invoice_status', 'nonce', false)) {
|
|
wp_send_json_error(
|
|
[
|
|
'message' => __('Sécurité : nonce invalide.', 'esi_peppol'),
|
|
],
|
|
400
|
|
);
|
|
}
|
|
|
|
if (!current_user_can('manage_woocommerce') && !current_user_can('manage_options')) {
|
|
wp_send_json_error(
|
|
[
|
|
'message' => __('Vous n\'avez pas les permissions nécessaires pour effectuer cette action.', 'esi_peppol'),
|
|
],
|
|
403
|
|
);
|
|
}
|
|
|
|
$order_id = isset($_POST['order_id']) ? (int) $_POST['order_id'] : 0; // phpcs:ignore WordPress.Security.NonceVerification.Missing
|
|
|
|
if ($order_id <= 0) {
|
|
wp_send_json_error(
|
|
[
|
|
'message' => __('Identifiant de commande invalide.', 'esi_peppol'),
|
|
],
|
|
400
|
|
);
|
|
}
|
|
|
|
$row = \ESI_PEPPOL\models\PEPPOL_Main_model::get_by_order_id($order_id);
|
|
|
|
if (!$row) {
|
|
wp_send_json_error(
|
|
[
|
|
'message' => __('Aucun enregistrement Peppol trouvé pour cette commande.', 'esi_peppol'),
|
|
],
|
|
404
|
|
);
|
|
}
|
|
|
|
$detail_message = '';
|
|
|
|
if (isset($row->response_data)) {
|
|
$data = $row->response_data;
|
|
|
|
if (is_array($data) && isset($data['message'])) {
|
|
$detail_message = (string) $data['message'];
|
|
} elseif (is_string($data) && $data !== '') {
|
|
$detail_message = $data;
|
|
}
|
|
}
|
|
|
|
if ($detail_message === '' && isset($row->message)) {
|
|
$detail_message = (string) $row->message;
|
|
}
|
|
|
|
$payload_response = [
|
|
'success' => !empty($row->success),
|
|
'status' => isset($row->status) ? (string) $row->status : '',
|
|
'message' => sprintf(
|
|
/* translators: %s: statut Peppol actuel */
|
|
__('Statut actuel du document : %s', 'esi_peppol'),
|
|
isset($row->status) ? (string) $row->status : __('inconnu', 'esi_peppol')
|
|
),
|
|
'detail' => $detail_message,
|
|
'http_code' => isset($row->http_code) ? (int) $row->http_code : 0,
|
|
];
|
|
|
|
if (!empty($row->success)) {
|
|
wp_send_json_success($payload_response);
|
|
}
|
|
|
|
// On renvoie tout de même une réponse structurée même en cas d'échec métier
|
|
wp_send_json_error($payload_response, 200);
|
|
}
|
|
|
|
public static function enqueue_front_assets() {
|
|
|
|
}
|
|
|
|
/**
|
|
* Ajoute un champ "Numéro de TVA de la boutique" dans les réglages
|
|
* WooCommerce > Général, juste après le code postal du magasin.
|
|
*
|
|
* @param array $settings
|
|
* @return array
|
|
*/
|
|
public static function filter_woocommerce_general_settings(array $settings): array {
|
|
$new_settings = [];
|
|
|
|
foreach ($settings as $setting) {
|
|
$new_settings[] = $setting;
|
|
|
|
if (isset($setting['id']) && $setting['id'] === 'woocommerce_store_postcode') {
|
|
$new_settings[] = [
|
|
'title' => __('Numéro de TVA de la boutique', 'esi_peppol'),
|
|
'desc' => __('Utilisé pour les factures Peppol (champ vendeur).', 'esi_peppol'),
|
|
'id' => 'woocommerce_store_vat_number',
|
|
'type' => 'text',
|
|
'default' => '',
|
|
'desc_tip' => true,
|
|
];
|
|
}
|
|
}
|
|
return $new_settings;
|
|
}
|
|
|
|
/**
|
|
* Retourne un message d'avertissement à propos du numéro de TVA
|
|
* de la boutique si celui-ci n'est pas encore renseigné dans
|
|
* les réglages WooCommerce.
|
|
*
|
|
* - Message d'invitation initial : aucune configuration ESI Peppol
|
|
* n'a encore été saisie.
|
|
* - Message de rappel : les identifiants ESI Peppol sont déjà
|
|
* enregistrés mais la TVA reste vide.
|
|
*
|
|
* @return string|null
|
|
*/
|
|
public static function get_vat_notice_message(): ?string {
|
|
$vat_number = (string) get_option('woocommerce_store_vat_number', '');
|
|
|
|
if ($vat_number !== '') {
|
|
return null;
|
|
}
|
|
|
|
$api_key = (string) get_option('esi_peppol_api_key', '');
|
|
$password = (string) get_option('esi_peppol_password', '');
|
|
|
|
if ($api_key === '' && $password === '') {
|
|
// Invitation initiale
|
|
return __(
|
|
'Pour finaliser la mise en place de Peppol, pensez à renseigner le numéro de TVA de la boutique dans WooCommerce > Réglages > Général.',
|
|
'esi_peppol'
|
|
);
|
|
}
|
|
|
|
// Rappel après configuration du connecteur
|
|
return __(
|
|
'Votre connecteur ESI Peppol est configuré, mais le numéro de TVA de la boutique n\'est pas encore renseigné dans WooCommerce > Réglages > Général. Sans ce numéro, les factures Peppol risquent d\'être incomplètes.',
|
|
'esi_peppol'
|
|
);
|
|
}
|
|
|
|
public static function write_log($message, $level = 'INFO') {
|
|
$message = self::format_message_for_log($message);
|
|
$log_entry = sprintf("[%s] [%s] %s\n", date('Y-m-d H:i:s'), $level, $message);
|
|
error_log($log_entry);
|
|
}
|
|
|
|
/**
|
|
* Écrit un message dans un fichier debug.txt sous le dossier uploads
|
|
* Chemin: wp-content/uploads/crvi-debug.txt
|
|
*/
|
|
public static function write_debug_file($message, $level = 'INFO') {
|
|
$message = self::format_message_for_log($message);
|
|
$log_entry = sprintf("[%s] [%s] %s\n", date('Y-m-d H:i:s'), $level, $message);
|
|
|
|
$upload_dir = wp_upload_dir();
|
|
$file_path = trailingslashit($upload_dir['basedir']) . 'crvi-debug.txt';
|
|
|
|
// Tente d'écrire le log. En cas d'échec, fallback sur error_log
|
|
@file_put_contents($file_path, $log_entry, FILE_APPEND);
|
|
|
|
// Écrire également dans le log PHP (wp-content/debug.log si WP_DEBUG_LOG actif, sinon error_log du serveur)
|
|
error_log($log_entry);
|
|
}
|
|
|
|
private static function format_message_for_log($message) {
|
|
if (is_array($message)) {
|
|
return print_r($message, true);
|
|
} elseif (is_object($message)) {
|
|
return print_r($message, true);
|
|
} elseif (is_bool($message)) {
|
|
return $message ? 'TRUE' : 'FALSE';
|
|
} elseif (is_numeric($message)) {
|
|
return (string) $message;
|
|
} elseif (is_null($message)) {
|
|
return 'NULL';
|
|
} else {
|
|
return var_export($message, true);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Envoie un email de notification en cas d'erreur API Peppol.
|
|
*
|
|
* @param int $order_id ID de la commande WooCommerce.
|
|
* @param array $api_result Résultat de l'appel API (success, http_code, message, data).
|
|
* @param array $payload Payload envoyé à l'API (optionnel, pour debug).
|
|
*
|
|
* @return bool True si l'email a été envoyé avec succès, false sinon.
|
|
*/
|
|
public static function send_api_error_email(int $order_id, array $api_result, array $payload = []): bool {
|
|
// Vérifier si l'email est configuré
|
|
$email = \get_option('esi_peppol_email', '');
|
|
if (empty($email) || !\is_email($email)) {
|
|
return false;
|
|
}
|
|
|
|
// Récupérer la commande
|
|
$order = \wc_get_order($order_id);
|
|
if (!$order instanceof \WC_Order) {
|
|
return false;
|
|
}
|
|
|
|
// Préparer les variables pour le template
|
|
$order_number = $order->get_order_number();
|
|
$http_code = isset($api_result['http_code']) ? (int) $api_result['http_code'] : 0;
|
|
$error_message = isset($api_result['message']) && $api_result['message'] !== ''
|
|
? (string) $api_result['message']
|
|
: \__('Erreur inconnue lors de l\'envoi vers l\'API Peppol.', 'esi_peppol');
|
|
|
|
// Extraire les données d'erreur supplémentaires
|
|
$error_data = [];
|
|
if (isset($api_result['data']) && is_array($api_result['data'])) {
|
|
$error_data = $api_result['data'];
|
|
}
|
|
// Si la structure error existe directement dans api_result, l'inclure aussi
|
|
if (isset($api_result['error']) && is_array($api_result['error'])) {
|
|
$error_data['error'] = $api_result['error'];
|
|
// Si le message d'erreur n'est pas défini, utiliser celui de error.message
|
|
if (empty($error_message) && isset($api_result['error']['message'])) {
|
|
$error_message = (string) $api_result['error']['message'];
|
|
}
|
|
}
|
|
|
|
// Récupérer le template email
|
|
$template_path = ESI_PEPPOL_DIR . 'templates/email/api-error.php';
|
|
if (!file_exists($template_path)) {
|
|
return false;
|
|
}
|
|
|
|
// Capturer le contenu du template
|
|
ob_start();
|
|
include $template_path;
|
|
$email_body = ob_get_clean();
|
|
|
|
// Préparer les en-têtes de l'email
|
|
$site_name = \get_bloginfo('name');
|
|
$headers = [
|
|
'Content-Type: text/html; charset=UTF-8',
|
|
'From: ' . $site_name . ' <' . \get_option('admin_email') . '>',
|
|
];
|
|
|
|
// Sujet de l'email
|
|
$subject = \sprintf(
|
|
/* translators: %1$s: site name, %2$s: order number */
|
|
\__('[%1$s] Erreur API Peppol - Commande %2$s', 'esi_peppol'),
|
|
$site_name,
|
|
$order_number
|
|
);
|
|
|
|
// Envoyer l'email
|
|
$sent = \wp_mail($email, $subject, $email_body, $headers);
|
|
|
|
// Log de l'envoi
|
|
if ($sent) {
|
|
self::write_debug_file(
|
|
[
|
|
'event' => 'api_error_email_sent',
|
|
'order_id' => $order_id,
|
|
'email' => $email,
|
|
'http_code' => $http_code,
|
|
'error_message' => $error_message,
|
|
],
|
|
'INFO'
|
|
);
|
|
} else {
|
|
self::write_debug_file(
|
|
[
|
|
'event' => 'api_error_email_failed',
|
|
'order_id' => $order_id,
|
|
'email' => $email,
|
|
'error' => 'wp_mail returned false',
|
|
],
|
|
'ERROR'
|
|
);
|
|
}
|
|
|
|
return $sent;
|
|
}
|
|
|
|
} |