194 lines
6.5 KiB
PHP
194 lines
6.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').
|
|
$billing_vat_number = (string) $order->get_meta('_billing_vat_number');
|
|
$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>';
|
|
}
|
|
|
|
} |