core = $core; } /** * Prepare extra gateways. * * @param WC_Gateway_Przelewy24 $main_gateway The main Przelewy24 gateway. */ public function prep_extra_gateways( WC_Gateway_Przelewy24 $main_gateway ) { $currency = get_woocommerce_currency(); $config = $this->core->get_config_for_currency( $currency ); $config->access_mode_to_strict(); $this->extra_gateways = array(); $to_prep = array(); if ( $config->get_p24_show_methods_checkout() ) { $imploded = $config->get_p24_paymethods_super_first(); $to_prep = explode( ',', $imploded ); if ( $to_prep ) { $all_banks = $main_gateway->get_all_payment_methods(); $generator = new Przelewy24Generator( $main_gateway ); $icon_generator = $this->core->get_cached_icon_generator(); } } foreach ( $to_prep as $id ) { $total = ( null !== WC()->cart ) ? (int) WC()->cart->total : 0; if ( ! $total && null !== WC()->cart ) { // hack for WooCommerce Active Payments pluin. $total = WC()->cart->get_cart_contents_total() + WC()->cart->get_taxes_total() + WC()->cart->get_shipping_total(); } if ( ! $this->is_p24_now_allowed( $total, $currency ) && 266 === (int) $id ) { continue; } if ( ! $this->is_oneyraty_now_allowed( $total, $currency ) && 294 === (int) $id ) { continue; } if ( ! $id ) { continue; } elseif ( ! isset( $all_banks[ $id ] ) ) { continue; } $icon = $icon_generator->get_icon( $id, true ); if ( ! $icon ) { /* Fallback. */ $icon = PRZELEWY24_URI . 'logo.png'; } $this->extra_gateways[] = new P24_Extra_Gateway( $id, $all_banks[ $id ], $generator, $main_gateway, $icon ); } } /** * Check if P24 Now is allowed * * @param numeric $amount Amount order. * @param string $currency Active currency. * * @return bool */ private function is_p24_now_allowed( $amount, $currency ) { return $amount > 0 && $amount < 10000 && 'PLN' === $currency; } /** * Check if Oney raty is allowed * * @param numeric $amount Amount order. * @param string $currency Active currency. * * @return bool */ private function is_oneyraty_now_allowed( $amount, $currency ) { return $amount >= 150 && $amount <= 30000 && 'PLN' === $currency; } /** * Inject additional gateways. * * Used for super first methods. * * @param array|null $gateways Prepared gateways or null. * @return array * @throws LogicException Throws if executed too early. */ public function inject_additional_gateways( $gateways ) { if ( ! $gateways ) { $gateways = array(); } $cart = WC()->cart; if ( $cart ) { $totals = $cart->get_totals(); $total = round( $totals['total'], 2 ); } else { $total = 0.; } if ( array_key_exists( WC_Gateway_Przelewy24::PAYMENT_METHOD, $gateways ) ) { if ( ! isset( $this->extra_gateways ) ) { throw new LogicException( 'The extra getways are not prepared yet.' ); } foreach ( $this->extra_gateways as $extra ) { if ( $extra->is_valid_for_price( $total ) ) { $gateways[ $extra->id ] = $extra; } } } return $gateways; } /** * Check gateway name. * * @param string $subject The gateway name. * @return bool */ private function check_gateway_name( $subject ) { $prefix = WC_Gateway_Przelewy24::PAYMENT_METHOD . '_extra_'; $prefix_quoted = preg_quote( $prefix, '/' ); $pattern = '/^' . $prefix_quoted . '\d+$/'; return (bool) preg_match( $pattern, $subject ); } /** * Do hack on hidden box. * * @param mixed $ignored We are not interested in changing this variable. * @param WP_Screen $screen Data about active screen. * @return mixed Return default value. */ public function do_hack_on_hidden_box( $ignored, WP_Screen $screen ) { /* Fix refunds */ if ( 'woocommerce' === $screen->parent_base && 'shop_order' === $screen->post_type ) { /* We have to try to overwrite this global variable. */ global $theorder; if ( $theorder instanceof \Automattic\WooCommerce\Admin\Overrides\Order ) { $old_method = $theorder->get_payment_method(); if ( $this->check_gateway_name( $old_method ) ) { try { $theorder->set_payment_method( WC_Gateway_Przelewy24::PAYMENT_METHOD ); } catch ( WC_Data_Exception $ex ) { error_log( __METHOD__ . ' There is an error with unknown plugin.' ); // phpcs:ignore error_log( __METHOD__ . $ex->getMessage() ); // phpcs:ignore return $ignored; } } } } /* We are not interested in altering default value. */ return $ignored; } /** * Hack to fix refund. * * @param string $gateway_name The gateway name. * @param WC_Order $order The order. * @return string */ public function do_hack_to_fix_refund( $gateway_name, WC_Order $order ) { if ( is_admin() ) { if ( $this->check_gateway_name( $gateway_name ) ) { if ( $order instanceof \Automattic\WooCommerce\Admin\Overrides\Order ) { return WC_Gateway_Przelewy24::PAYMENT_METHOD; } } } return $gateway_name; } /** * Bind common events. */ public function bind_common_events() { add_filter( 'woocommerce_available_payment_gateways', array( $this, 'inject_additional_gateways' ), 256, 1 ); add_filter( 'default_hidden_meta_boxes', array( $this, 'do_hack_on_hidden_box' ), 5, 2 ); add_filter( 'woocommerce_order_get_payment_method', array( $this, 'do_hack_to_fix_refund' ), 10, 2 ); } }