<?php
/**
* Helper methods for PUI.
*
* @package WooCommerce\PayPalCommerce\WcGateway\Helper
*/
declare( strict_types=1 );
namespace WooCommerce\PayPalCommerce\WcGateway\Helper;
use WC_Customer;
use WC_Order;
use WC_Order_Item_Product;
use WooCommerce\PayPalCommerce\WcGateway\Exception\NotFoundException;
use WooCommerce\PayPalCommerce\WcGateway\Settings\Settings;
/**
* Class PayUponInvoiceHelper
*/
class PayUponInvoiceHelper {
/**
* The checkout helper.
*
* @var CheckoutHelper
*/
protected $checkout_helper;
/**
* The api shop country.
*
* @var string
*/
protected $api_shop_country;
/**
* PayUponInvoiceHelper constructor.
*
* @param CheckoutHelper $checkout_helper The checkout helper.
* @param string $api_shop_country The api shop country.
*/
public function __construct( CheckoutHelper $checkout_helper, string $api_shop_country ) {
$this->checkout_helper = $checkout_helper;
$this->api_shop_country = $api_shop_country;
}
/**
* Checks whether checkout is ready for PUI.
*
* @return bool
* @psalm-suppress RedundantConditionGivenDocblockType
*/
public function is_checkout_ready_for_pui(): bool {
$gateway_settings = get_option( 'woocommerce_ppcp-pay-upon-invoice-gateway_settings' );
if ( $gateway_settings && '' === $gateway_settings['customer_service_instructions'] ) {
return false;
}
if ( ! WC()->customer instanceof WC_Customer ) {
return false;
}
// phpcs:ignore WordPress.Security.NonceVerification.Missing
$billing_country = WC()->customer->get_billing_country();
if ( empty( $billing_country ) || 'DE' !== $billing_country ) {
return false;
}
// phpcs:ignore WordPress.Security.NonceVerification.Missing
$shipping_country = WC()->customer->get_shipping_country();
if ( empty( $shipping_country ) || 'DE' !== $shipping_country ) {
return false;
}
if (
! $this->is_valid_product()
|| ! $this->is_valid_currency()
|| ! $this->checkout_helper->is_checkout_amount_allowed( 5, 2500 )
) {
return false;
}
return true;
}
/**
* Checks whether PUI gateway is enabled.
*
* @return bool True if PUI gateway is enabled, otherwise false.
*/
public function is_pui_gateway_enabled(): bool {
$gateway_settings = get_option( 'woocommerce_ppcp-pay-upon-invoice-gateway_settings' );
return isset( $gateway_settings['enabled'] ) && $gateway_settings['enabled'] === 'yes' && 'DE' === $this->api_shop_country;
}
/**
* Checks if product is valid for PUI.
*
* @return bool
*/
private function is_valid_product(): bool {
$cart = WC()->cart ?? null;
if ( $cart && ! is_checkout_pay_page() ) {
$items = $cart->get_cart_contents();
foreach ( $items as $item ) {
$product_id = $item['product_id'];
if ( isset( $item['variation_id'] ) && $item['variation_id'] ) {
$product_id = $item['variation_id'];
}
$product = wc_get_product( $product_id );
if ( $product && ! $this->checkout_helper->is_physical_product( $product ) ) {
return false;
}
}
}
if ( is_wc_endpoint_url( 'order-pay' ) ) {
/**
* Needed for WordPress `query_vars`.
*
* @psalm-suppress InvalidGlobal
*/
global $wp;
if ( isset( $wp->query_vars['order-pay'] ) && absint( $wp->query_vars['order-pay'] ) > 0 ) {
$order_id = absint( $wp->query_vars['order-pay'] );
$order = wc_get_order( $order_id );
if ( is_a( $order, WC_Order::class ) ) {
foreach ( $order->get_items() as $item_id => $item ) {
if ( is_a( $item, WC_Order_Item_Product::class ) ) {
$product = wc_get_product( $item->get_product_id() );
if ( $product && ! $this->checkout_helper->is_physical_product( $product ) ) {
return false;
}
}
}
}
}
}
return true;
}
/**
* Checks whether pay for order is ready for PUI.
*
* @return bool
*/
public function is_pay_for_order_ready_for_pui(): bool {
/**
* Needed for WordPress `query_vars`.
*
* @psalm-suppress InvalidGlobal
*/
global $wp;
$order_id = (int) ( $wp->query_vars['order-pay'] ?? 0 );
if ( $order_id === 0 ) {
return false;
}
$order = wc_get_order( $order_id );
if ( ! is_a( $order, WC_Order::class ) ) {
return false;
}
$address = $order->get_address();
$required_fields = array(
'first_name',
'last_name',
'email',
'phone',
'address_1',
'city',
'postcode',
'country',
);
foreach ( $required_fields as $key ) {
$value = $address[ $key ] ?? '';
if ( $value === '' ) {
return false;
}
}
return true;
}
/**
* Checks if currency is allowed for PUI.
*
* @return bool
*/
private function is_valid_currency(): bool {
global $wp;
$order_id = isset( $wp->query_vars['order-pay'] ) ? (int) $wp->query_vars['order-pay'] : 0;
if ( 0 === $order_id ) {
return 'EUR' === get_woocommerce_currency();
}
$order = wc_get_order( $order_id );
if ( is_a( $order, WC_Order::class ) ) {
return 'EUR' === $order->get_currency();
}
return false;
}
}