/**
* Scalona obsługa zamówień subskrypcji:
* - Automatyczne oznaczanie jako "completed" dla produktów wirtualnych
* - Automatyczna aktywacja subskrypcji po opłaceniu
*
* UWAGA: Przy subskrypcji dostępna jest tylko możliwość płatności kartą.
* Inne metody (np. Przelewy24) nie wspierają automatycznego odnawiania subskrypcji.
*/
// Unikalne nazwy funkcji żeby uniknąć konfliktów
if (!function_exists('custom_handle_subscription_payment_v2')) {
// Główny handler dla payment_complete
add_action('woocommerce_payment_complete', 'custom_handle_subscription_payment_v2', 10, 1);
// Dodatkowe hooki dla aktywacji subskrypcji
add_action('woocommerce_order_status_completed', 'custom_activate_subscription_completed_v2');
add_action('woocommerce_thankyou', 'custom_activate_subscription_thankyou_v2');
/**
* Główna funkcja obsługująca payment_complete
* Łączy funkcjonalność auto-complete i aktywacji subskrypcji
*/
function custom_handle_subscription_payment_v2($order_id) {
if (!$order_id) return;
$order = wc_get_order($order_id);
if (!$order) return;
// 1. NAJPIERW: Aktywuj subskrypcję (przed zmianą statusu zamówienia)
custom_activate_subscription_after_payment_v2($order_id);
// 2. POTEM: Sprawdź czy można auto-complete zamówienie
custom_auto_complete_virtual_orders_v2($order_id, $order);
}
/**
* Aktywacja subskrypcji po potwierdzeniu płatności
*/
function custom_activate_subscription_after_payment_v2($order_id) {
if (!function_exists('wcs_get_subscriptions_for_order')) return;
$subscriptions = wcs_get_subscriptions_for_order($order_id);
foreach ($subscriptions as $subscription) {
if (!in_array($subscription->get_status(), ['active', 'pending-cancel'])) {
$subscription->update_status('active', __('Subskrypcja aktywowana po potwierdzeniu płatności.', 'woocommerce-subscriptions'));
}
}
}
/**
* Auto-complete dla zamówień zawierających tylko produkty wirtualne
*/
function custom_auto_complete_virtual_orders_v2($order_id, $order) {
// Nie ruszaj jeśli już completed
if ($order->get_status() === 'completed') return;
$is_virtual = true;
foreach ($order->get_items() as $item) {
$product = $item->get_product();
// Jeśli produkt nie istnieje lub nie jest wirtualny – nie kończ zamówienia
if (!$product || !$product->is_virtual()) {
$is_virtual = false;
break;
}
}
if ($is_virtual) {
$order->update_status('completed', __('Zamówienie automatycznie ukończone - produkty wirtualne.'));
}
}
/**
* Aktywacja subskrypcji gdy zamówienie przejdzie w status completed
*/
function custom_activate_subscription_completed_v2($order_id) {
if (!function_exists('wcs_get_subscriptions_for_order')) return;
$order = wc_get_order($order_id);
if (!$order) return;
$subscriptions = wcs_get_subscriptions_for_order($order_id, array('order_type' => array('parent', 'renewal')));
foreach ($subscriptions as $subscription) {
if (!in_array($subscription->get_status(), ['active', 'pending-cancel'])) {
$subscription->update_status('active', __('Subskrypcja automatycznie aktywowana po ukończeniu zamówienia.', 'woocommerce-subscriptions'));
$order->add_order_note(sprintf(__('Subskrypcja #%s została automatycznie aktywowana.', 'woocommerce-subscriptions'), $subscription->get_id()));
}
}
}
/**
* Aktywacja subskrypcji na stronie podziękowania (backup)
*/
function custom_activate_subscription_thankyou_v2($order_id) {
if (!$order_id) return;
$order = wc_get_order($order_id);
if (!$order || !$order->is_paid()) return;
if (function_exists('wcs_get_subscriptions_for_order')) {
$subscriptions = wcs_get_subscriptions_for_order($order_id);
foreach ($subscriptions as $subscription) {
if (!in_array($subscription->get_status(), ['active', 'pending-cancel'])) {
$subscription->update_status('active', __('Subskrypcja aktywowana na stronie podziękowania.', 'woocommerce-subscriptions'));
}
}
}
}
}