274 lines
9.5 KiB
PHP
274 lines
9.5 KiB
PHP
<?php
|
|
|
|
namespace ESI_PEPPOL\controllers;
|
|
|
|
class PEPPOL_Woocommerce_controller {
|
|
|
|
/**
|
|
* Enregistre les hooks WooCommerce nécessaires.
|
|
*
|
|
* À appeler depuis le contrôleur principal du plugin.
|
|
*
|
|
* @return void
|
|
*/
|
|
public static function register_hooks(): void {
|
|
// Déclenché lorsque le paiement d'une commande est complété
|
|
\add_action(
|
|
'woocommerce_payment_complete',
|
|
[self::class, 'post_payment'],
|
|
10,
|
|
1
|
|
);
|
|
|
|
// Sécurité : on écoute également le passage au statut "completed"
|
|
\add_action(
|
|
'woocommerce_order_status_completed',
|
|
[self::class, 'post_payment'],
|
|
10,
|
|
1
|
|
);
|
|
|
|
// Alerte admin si BACS est activé mais sans comptes bancaires renseignés
|
|
\add_action(
|
|
'admin_notices',
|
|
[self::class, 'maybe_show_bacs_notice']
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Callback déclenché après le paiement ou lors du passage
|
|
* d'une commande au statut "terminée".
|
|
*
|
|
* @param int $order_id ID de la commande WooCommerce.
|
|
*
|
|
* @return void
|
|
*/
|
|
public static function post_payment(int $order_id): void {
|
|
$order_id = (int) $order_id;
|
|
|
|
if ($order_id <= 0) {
|
|
return;
|
|
}
|
|
|
|
$order = \wc_get_order($order_id);
|
|
|
|
if (!$order instanceof \WC_Order) {
|
|
return;
|
|
}
|
|
|
|
// N'envoyer vers Peppol que les commandes avec un numéro de TVA saisi ET valide.
|
|
// Le plugin "WooCommerce EU VAT Number" stocke le numéro validé dans la meta "_billing_vat_number"
|
|
// et le statut de validation dans "_vat_number_is_valid" (valeur 'true' ou 'false').
|
|
// Utilisation du champ TVA configuré dans les settings si disponible, sinon utilisation de la fonction helper
|
|
$saved_vat_field = \get_option('esi_peppol_vat_field_key', '');
|
|
|
|
if (!empty($saved_vat_field)) {
|
|
// Utiliser le champ TVA sauvegardé dans les settings
|
|
$billing_vat_number = $order->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 '<pre>';
|
|
print_r($payload);
|
|
echo '</pre>';
|
|
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 '<div class="notice notice-warning"><p>' .
|
|
\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'
|
|
) .
|
|
'</p></div>';
|
|
}
|
|
|
|
/**
|
|
* 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 '<span class="na">–</span>';
|
|
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 '<span class="na">–</span>';
|
|
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(
|
|
'<a href="%s" class="%s" title="%s">%s</a>',
|
|
\esc_url($detail_url),
|
|
\esc_attr($status_class),
|
|
\esc_attr__('Voir les détails du log Peppol', 'esi_peppol'),
|
|
\esc_html($log->status)
|
|
);
|
|
}
|
|
|
|
} |