Files
2025-11-24 21:33:55 +00:00

284 lines
8.5 KiB
PHP

<?php
/**
* WooPay
*
* @package WCPay\WooPay
*/
namespace WCPay\WooPay;
use Automattic\WooCommerce\Blocks\Integrations\IntegrationRegistry;
use Automattic\WooCommerce\Blocks\Integrations\IntegrationInterface;
/**
* WooPay
*/
class WooPay_Adapted_Extensions extends IntegrationRegistry {
const POINTS_AND_REWARDS_PLUGIN = 'woocommerce-points-and-rewards';
const POINTS_AND_REWARDS_API = 'points-and-rewards';
const GIFT_CARDS_API = 'woocommerce-gift-cards';
const GIFT_CARDS_BLOCKS = 'wc-gift-cards-blocks';
/**
* Initializa WC Blocks regitered integrations.
*/
public function init() {
do_action( 'woocommerce_blocks_checkout_block_registration', $this );
}
/**
* Get WooPay adapted extensions settings and extra data needed on WooPay.
*
* @param string $email The user email the data will be loaded.
*
* @return array The extensions script data.
*/
public function get_adapted_extensions_data( $email ) {
$enabled_adapted_extensions = get_option( WooPay_Scheduler::ENABLED_ADAPTED_EXTENSIONS_OPTION_NAME, [] );
if ( ( is_countable( $enabled_adapted_extensions ) ? count( $enabled_adapted_extensions ) : 0 ) === 0 ) {
return [];
}
$extension_settings = [];
$user = wp_get_current_user();
if ( ! is_user_logged_in() ) {
// If the user is a guest and has an account on the merchant site, load data
// from there to check if we need to verify their email on WooPay later.
$user_by_email = get_user_by( 'email', $email );
if ( false !== $user_by_email ) {
$user = $user_by_email;
}
}
// Points and Rewards.
if ( in_array( self::POINTS_AND_REWARDS_PLUGIN, $enabled_adapted_extensions, true ) ) {
$points_and_rewards_data = self::get_points_and_rewards_data( $user );
if ( null !== $points_and_rewards_data ) {
$extension_settings[ self::POINTS_AND_REWARDS_API ] = $points_and_rewards_data;
}
}
if ( in_array( self::GIFT_CARDS_API, $enabled_adapted_extensions, true ) ) {
$gift_cards_data = self::get_gift_cards_data( $user );
if ( null !== $gift_cards_data ) {
$extension_settings[ self::GIFT_CARDS_API ] = $gift_cards_data;
}
}
return $extension_settings;
}
/**
* Get Points and Rewards settings for WooPay.
*
* @param \WP_User $user The user the data will be loaded.
*
* @return array|null The Points and Rewards script data if installed.
*/
public function get_points_and_rewards_data( $user ) {
if (
empty( $this->registered_integrations[ self::POINTS_AND_REWARDS_API ] ) ||
! class_exists( 'WC_Points_Rewards_Manager' ) ||
! method_exists( 'WC_Points_Rewards_Manager', 'get_users_points' )
) {
return null;
}
$points_and_rewards_script_data = $this->registered_integrations[ self::POINTS_AND_REWARDS_API ]->get_script_data();
list( $points, $monetary_value ) = explode( ':', get_option( 'wc_points_rewards_redeem_points_ratio', '' ) );
$points = floatval( $points );
$monetary_value = floatval( $monetary_value );
$points_and_rewards_script_data['points_ratio'] = [
'points' => $points,
'monetary_value' => $monetary_value,
];
/**
* Check if the user has points to show the verify email alert.
*
* @psalm-suppress UndefinedClass
*/
$available_points_for_user = \WC_Points_Rewards_Manager::get_users_points( $user->ID );
if ( $available_points_for_user > 0 && $available_points_for_user > $points_and_rewards_script_data['minimum_points_amount'] ) {
// Only ask the user to verify email if they have available points.
$points_and_rewards_script_data['should_verify_email'] = ! is_user_logged_in();
$points_and_rewards_script_data['points_available'] = $available_points_for_user;
}
return $points_and_rewards_script_data;
}
/**
* Get Gift Cards settings for WooPay.
*
* @param \WP_User $user The user the data will be loaded.
*
* @return array|null The Gift Cards script data if installed.
*/
public function get_gift_cards_data( $user ) {
if (
empty( $this->registered_integrations[ self::GIFT_CARDS_BLOCKS ] ) ||
! function_exists( 'WC_GC' ) ||
! property_exists( WC_GC(), 'account' ) ||
! method_exists( WC_GC()->account, 'get_active_giftcards' )
) {
return null;
}
$gift_cards_script_data = $this->registered_integrations[ self::GIFT_CARDS_BLOCKS ]->get_script_data();
$gift_cards_script_data['should_verify_email'] = false;
if ( ! is_user_logged_in() ) {
// Verify if the user has Gift Card balance to ask them to verify email on WooPay.
$gift_cards = WC_GC()->account->get_active_giftcards( $user->ID );
$balance = 0;
foreach ( $gift_cards as $giftcard_data ) {
$balance += (float) $giftcard_data->get_balance();
}
if ( $balance > 0 ) {
$gift_cards_script_data['should_verify_email'] = true;
}
}
return $gift_cards_script_data;
}
/**
* The custom data from plugins to be used on WooPay,
* it's not an adapted extension because it doesn't
* use the email verification integration.
*
* @return array The custom data.
*/
public function get_extension_data() {
$extension_data = [];
if ( defined( 'WOOCOMMERCE_MULTICURRENCY_VERSION' ) ) {
$extension_data['woocommerce-multicurrency'] = [
'currency' => get_woocommerce_currency(),
];
}
if ( $this->is_affiliate_for_woocommerce_enabled() && function_exists( 'afwc_get_referrer_id' ) ) {
/**
* Suppress psalm warning.
*
* @psalm-suppress UndefinedFunction
*/
$extension_data['affiliate-for-woocommerce'] = [
'affiliate-user' => afwc_get_referrer_id(),
];
}
if ( $this->is_automate_woo_referrals_enabled() ) {
$advocate_id = $this->get_automate_woo_advocate_id_from_cookie();
$extension_data['automatewoo-referrals'] = [
'advocate_id' => $advocate_id,
];
}
return $extension_data;
}
/**
* Update order extension data after finishing
* an order on WooPay, this usually is needed
* for extensions which uses cookies when an
* order is finished.
*
* @param int $order_id The successful WooPay order.
*/
public function update_order_extension_data( $order_id ) {
if ( ! empty( $_GET['affiliate'] ) && // phpcs:ignore WordPress.Security.NonceVerification
$this->is_affiliate_for_woocommerce_enabled()
) {
$affiliate_id = (int) wc_clean( wp_unslash( $_GET['affiliate'] ) ); // phpcs:ignore WordPress.Security.NonceVerification
if ( class_exists( '\AFWC_API' ) ) {
// phpcs:ignore
/**
* @psalm-suppress UndefinedClass
*/
$affiliate_api = \AFWC_API::get_instance();
$affiliate_api->track_conversion( $order_id, $affiliate_id, '', [ 'is_affiliate_eligible' => true ] );
}
}
}
/**
* Get WC Blocks registered integrations.
*
* @param IntegrationInterface $integration An instance of IntegrationInterface.
*
* @return boolean True means registered successfully.
*/
public function register( IntegrationInterface $integration ) {
$name = $integration->get_name();
if ( self::GIFT_CARDS_BLOCKS === $name || self::POINTS_AND_REWARDS_API === $name ) {
$this->registered_integrations[ $name ] = $integration;
}
return true;
}
/**
* Check if Affiliate for WooCommerce is enabled and
* its functions used on WCPay are available.
*
* @return boolean
*/
public function is_affiliate_for_woocommerce_enabled() {
return defined( 'AFWC_PLUGIN_FILE' ) &&
function_exists( 'afwc_get_referrer_id' ) &&
class_exists( 'AFWC_API' ) &&
method_exists( 'AFWC_API', 'get_instance' ) &&
method_exists( 'AFWC_API', 'track_conversion' );
}
/**
* Check if Automate Woo Referrals is enabled and
* its functions used on WCPay are available.
*
* @psalm-suppress UndefinedClass
* @psalm-suppress UndefinedFunction
*
* @return boolean
*/
private function is_automate_woo_referrals_enabled() {
return function_exists( 'AW_Referrals' ) &&
method_exists( AW_Referrals(), 'options' ) &&
AW_Referrals()->options()->type === 'link' &&
class_exists( '\AutomateWoo\Referrals\Referral_Manager' ) &&
method_exists( \AutomateWoo\Referrals\Referral_Manager::class, 'get_advocate_key_from_cookie' );
}
/**
* Get AutomateWoo advocate id from cookie.
*
* @psalm-suppress UndefinedClass
*
* @return string|null
*/
private function get_automate_woo_advocate_id_from_cookie() {
if ( class_exists( '\AutomateWoo\Referrals\Referral_Manager' ) ) {
$advocate_from_key_cookie = \AutomateWoo\Referrals\Referral_Manager::get_advocate_key_from_cookie();
return $advocate_from_key_cookie ? $advocate_from_key_cookie->get_advocate_id() : null;
}
return null;
}
}