301 lines
11 KiB
PHP
301 lines
11 KiB
PHP
<?php
|
|
declare(strict_types=1);
|
|
/**
|
|
* Plugin Name: ESI_peppol
|
|
* Description: Woocommerce peppol gateway
|
|
* Version: 0.1.0
|
|
* Author: Esi informatique
|
|
* Text Domain: esi_peppol
|
|
* RequiresPHP: 7.0
|
|
* RequiresPlugins: woocommerce/woocommerce.php
|
|
*/
|
|
|
|
if (!defined('ABSPATH')) {
|
|
exit;
|
|
}
|
|
|
|
// Vérification de la version minimale de PHP requise
|
|
if (version_compare(PHP_VERSION, '7.0.0', '<')) {
|
|
// Afficher un message d'erreur dans l'admin
|
|
add_action('admin_notices', function () {
|
|
if (!function_exists('esc_html__') || !function_exists('esc_html')) {
|
|
// Fallback si les fonctions WordPress ne sont pas encore chargées
|
|
echo '<div class="notice notice-error"><p><strong>ESI Peppol</strong> : Ce plugin nécessite PHP 7.0.0 ou supérieur. Vous utilisez actuellement PHP ' . htmlspecialchars(PHP_VERSION, ENT_QUOTES, 'UTF-8') . '. Veuillez mettre à jour votre version de PHP.</p></div>';
|
|
return;
|
|
}
|
|
?>
|
|
<div class="notice notice-error">
|
|
<p>
|
|
<strong><?php esc_html_e('ESI Peppol', 'esi_peppol'); ?></strong> :
|
|
<?php
|
|
printf(
|
|
/* translators: 1: Version PHP actuelle, 2: Version PHP minimale requise */
|
|
esc_html__('Ce plugin nécessite PHP %2$s ou supérieur. Vous utilisez actuellement PHP %1$s. Veuillez mettre à jour votre version de PHP.', 'esi_peppol'),
|
|
esc_html(PHP_VERSION),
|
|
'7.0.0'
|
|
);
|
|
?>
|
|
</p>
|
|
</div>
|
|
<?php
|
|
});
|
|
|
|
// Désactiver le plugin si la version PHP est trop ancienne
|
|
add_action('admin_init', function () {
|
|
if (function_exists('deactivate_plugins') && function_exists('plugin_basename')) {
|
|
deactivate_plugins(plugin_basename(__FILE__));
|
|
}
|
|
});
|
|
|
|
return;
|
|
}
|
|
|
|
// Fonction pour vérifier si WooCommerce est actif
|
|
function esi_peppol_is_woocommerce_active(): bool {
|
|
// Vérifier si la classe WooCommerce existe (WooCommerce chargé)
|
|
if (class_exists('WooCommerce')) {
|
|
return true;
|
|
}
|
|
|
|
// Vérifier si WooCommerce est dans la liste des plugins actifs
|
|
if (!function_exists('is_plugin_active')) {
|
|
if (file_exists(ABSPATH . 'wp-admin/includes/plugin.php')) {
|
|
require_once ABSPATH . 'wp-admin/includes/plugin.php';
|
|
}
|
|
}
|
|
|
|
if (function_exists('is_plugin_active')) {
|
|
return is_plugin_active('woocommerce/woocommerce.php');
|
|
}
|
|
|
|
// Fallback : vérifier dans la liste des plugins actifs
|
|
$active_plugins = get_option('active_plugins', []);
|
|
if (in_array('woocommerce/woocommerce.php', $active_plugins, true)) {
|
|
return true;
|
|
}
|
|
|
|
// Vérifier aussi dans les plugins réseau (multisite)
|
|
if (is_multisite()) {
|
|
$network_plugins = get_site_option('active_sitewide_plugins', []);
|
|
if (isset($network_plugins['woocommerce/woocommerce.php'])) {
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
// Vérification de la dépendance WooCommerce
|
|
if (!esi_peppol_is_woocommerce_active()) {
|
|
// Afficher un message d'erreur dans l'admin
|
|
add_action('admin_notices', function () {
|
|
if (!function_exists('esc_html__') || !function_exists('esc_html')) {
|
|
// Fallback si les fonctions WordPress ne sont pas encore chargées
|
|
echo '<div class="notice notice-error"><p><strong>ESI Peppol</strong> : Ce plugin nécessite WooCommerce. Veuillez installer et activer WooCommerce avant d\'utiliser ce plugin.</p></div>';
|
|
return;
|
|
}
|
|
?>
|
|
<div class="notice notice-error">
|
|
<p>
|
|
<strong><?php esc_html_e('ESI Peppol', 'esi_peppol'); ?></strong> :
|
|
<?php esc_html_e('Ce plugin nécessite WooCommerce. Veuillez installer et activer WooCommerce avant d\'utiliser ce plugin.', 'esi_peppol'); ?>
|
|
</p>
|
|
</div>
|
|
<?php
|
|
});
|
|
|
|
// Désactiver le plugin si WooCommerce n'est pas disponible
|
|
add_action('admin_init', function () {
|
|
if (function_exists('deactivate_plugins') && function_exists('plugin_basename')) {
|
|
deactivate_plugins(plugin_basename(__FILE__));
|
|
}
|
|
});
|
|
|
|
// Empêcher le chargement du reste du plugin
|
|
return;
|
|
}
|
|
|
|
define('ESI_PEPPOL_VERSION', '0.1.0');
|
|
define('ESI_PEPPOL_DIR', plugin_dir_path(__FILE__));
|
|
define('ESI_PEPPOL_URL', plugin_dir_url(__FILE__));
|
|
|
|
use ESI_PEPPOL\controllers\PEPPOL_Plugin;
|
|
|
|
// Autoloader simple pour les classes PEPPOL (contrôleurs, modèles...) et celles avec namespace
|
|
spl_autoload_register(function ($class) {
|
|
|
|
if (strpos($class, 'ESI_PEPPOL\\') === 0 || strpos($class, 'PEPPOL_') === 0) {
|
|
|
|
// Gestion des classes avec namespace ESI_PEPPOL
|
|
if (strpos($class, 'ESI_PEPPOL') === 0) {
|
|
$base_dir = __DIR__ . '/app/';
|
|
|
|
$relative_class = substr($class, strlen('ESI_PEPPOL\\'));
|
|
|
|
// Mapping simple pour les classes PEPPOL_
|
|
if (strpos($relative_class, 'controllers\\PEPPOL_') === 0) {
|
|
$class_name = substr($relative_class, strlen('controllers\\PEPPOL_'));
|
|
// Pour PEPPOL_Event_Controller -> Event_Controller.php
|
|
$file = $base_dir . 'controllers/' . $class_name . '.php';
|
|
|
|
if (file_exists($file)) {
|
|
require_once $file;
|
|
return;
|
|
}
|
|
}
|
|
|
|
if (strpos($relative_class, 'views\\PEPPOL_') === 0) {
|
|
$class_name = substr($relative_class, strlen('views\\PEPPOL_'));
|
|
$file = $base_dir . 'views/' . $class_name . '.php';
|
|
|
|
if (file_exists($file)) {
|
|
require_once $file;
|
|
return;
|
|
}
|
|
}
|
|
|
|
if (strpos($relative_class, 'models\\PEPPOL_') === 0) {
|
|
$class_name = substr($relative_class, strlen('models\\PEPPOL_'));
|
|
$file = $base_dir . 'models/' . $class_name . '.php';
|
|
|
|
if (file_exists($file)) {
|
|
require_once $file;
|
|
return;
|
|
}
|
|
}
|
|
|
|
if (strpos($relative_class, 'helpers\\PEPPOL_') === 0) {
|
|
$class_name = substr($relative_class, strlen('helpers\\PEPPOL_'));
|
|
$file = $base_dir . 'helpers/' . $class_name . '.php';
|
|
|
|
if (file_exists($file)) {
|
|
require_once $file;
|
|
return;
|
|
}
|
|
}
|
|
|
|
// Mapping explicite pour les classes PEPPOL_ dont le nom de fichier
|
|
// ne suit pas strictement le schéma "NomDeClasse.php".
|
|
switch ($relative_class) {
|
|
case 'controllers\\PEPPOL_Plugin':
|
|
$file = $base_dir . 'controllers/Plugin.php';
|
|
break;
|
|
case 'controllers\\PEPPOL_Woocommerce_controller':
|
|
$file = $base_dir . 'controllers/Woocommerce_controller.php';
|
|
break;
|
|
case 'controllers\\PEPPOL_peppol_controller':
|
|
$file = $base_dir . 'controllers/Peppol_controller.php';
|
|
break;
|
|
case 'controllers\\PEPPOL_Webhook_controller':
|
|
$file = $base_dir . 'controllers/Webhook_controller.php';
|
|
break;
|
|
case 'models\\PEPPOL_Main_model':
|
|
$file = $base_dir . 'models/Main_model.php';
|
|
break;
|
|
|
|
case 'helpers\\PEPPOL_Woo_Helper':
|
|
// Helper WooCommerce : fichier réel situé dans "app/helper/woo_helper.php"
|
|
// Attention : sur les systèmes Linux, la casse et le nom du dossier/import doivent correspondre.
|
|
$file = $base_dir . 'helper/woo_helper.php';
|
|
break;
|
|
default:
|
|
// Fallback : essayer le mapping standard
|
|
$file = $base_dir . str_replace('\\', '/', $relative_class) . '.php';
|
|
break;
|
|
}
|
|
|
|
if (file_exists($file)) {
|
|
require_once $file;
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
});
|
|
|
|
// Hook d'activation du plugin avec vérification WooCommerce
|
|
register_activation_hook(
|
|
__FILE__,
|
|
function () {
|
|
// Vérifier si WooCommerce est actif avant l'activation
|
|
if (!esi_peppol_is_woocommerce_active()) {
|
|
deactivate_plugins(plugin_basename(__FILE__));
|
|
wp_die(
|
|
esc_html__('ESI Peppol nécessite WooCommerce pour fonctionner. Veuillez installer et activer WooCommerce avant d\'activer ce plugin.', 'esi_peppol'),
|
|
esc_html__('Dépendance manquante', 'esi_peppol'),
|
|
['back_link' => true]
|
|
);
|
|
}
|
|
// Déléguer à PEPPOL_Plugin::activate() si WooCommerce est disponible
|
|
PEPPOL_Plugin::activate();
|
|
}
|
|
);
|
|
|
|
// Menu et pages d'administration du plugin
|
|
add_action(
|
|
'admin_menu',
|
|
[PEPPOL_Plugin::class, 'add_admin_menu']
|
|
);
|
|
|
|
// Assets d'administration
|
|
add_action(
|
|
'admin_enqueue_scripts',
|
|
[PEPPOL_Plugin::class, 'enqueue_admin_assets']
|
|
);
|
|
|
|
// AJAX admin pour test de connexion API
|
|
add_action(
|
|
'wp_ajax_esi_peppol_test_connection',
|
|
[PEPPOL_Plugin::class, 'ajax_test_connection']
|
|
);
|
|
|
|
// AJAX admin pour renvoyer une facture Peppol depuis la page de logs
|
|
add_action(
|
|
'wp_ajax_esi_peppol_resend_invoice',
|
|
[PEPPOL_Plugin::class, 'ajax_resend_invoice']
|
|
);
|
|
|
|
// AJAX admin pour consulter le statut d'une facture Peppol depuis la page de logs
|
|
add_action(
|
|
'wp_ajax_esi_peppol_check_invoice_status',
|
|
[PEPPOL_Plugin::class, 'ajax_check_invoice_status']
|
|
);
|
|
|
|
// AJAX admin pour récupérer les détails d'un log Peppol
|
|
add_action(
|
|
'wp_ajax_esi_peppol_get_log_details',
|
|
[PEPPOL_Plugin::class, 'ajax_get_log_details']
|
|
);
|
|
|
|
// AJAX admin pour détecter les champs TVA
|
|
add_action(
|
|
'wp_ajax_esi_peppol_detect_vat_fields',
|
|
[PEPPOL_Plugin::class, 'ajax_detect_vat_fields']
|
|
);
|
|
|
|
// AJAX admin pour sauvegarder le champ TVA sélectionné
|
|
add_action(
|
|
'wp_ajax_esi_peppol_save_vat_field',
|
|
[PEPPOL_Plugin::class, 'ajax_save_vat_field']
|
|
);
|
|
|
|
// Champ TVA de la boutique dans les réglages WooCommerce > Général.
|
|
add_filter(
|
|
'woocommerce_general_settings',
|
|
[PEPPOL_Plugin::class, 'filter_woocommerce_general_settings']
|
|
);
|
|
|
|
// Initialisation générale du plugin (hooks WooCommerce, etc.)
|
|
add_action(
|
|
'plugins_loaded',
|
|
static function () {
|
|
$plugin = new PEPPOL_Plugin();
|
|
$plugin->init();
|
|
},
|
|
20
|
|
);
|
|
|
|
// Enregistrement des routes REST API pour les webhooks
|
|
add_action(
|
|
'rest_api_init',
|
|
[\ESI_PEPPOL\controllers\PEPPOL_Webhook_controller::class, 'register_routes']
|
|
);
|