diff --git a/woocommerce-wirecard-checkout-seamless/classes/class-wirecard-admin.php b/woocommerce-wirecard-checkout-seamless/classes/class-wirecard-admin.php
index bdc48c4..af98123 100644
--- a/woocommerce-wirecard-checkout-seamless/classes/class-wirecard-admin.php
+++ b/woocommerce-wirecard-checkout-seamless/classes/class-wirecard-admin.php
@@ -406,7 +406,7 @@ public function print_transaction_details( $data ) {
echo "
";
if ( $brand == 'Invoice' ) {
- echo "";
+ echo "";
} elseif ( $operation == 'DEPOSIT' or $operation == 'REFUND' ) {
echo "";
}
diff --git a/woocommerce-wirecard-checkout-seamless/classes/class-wirecard-backend-operations.php b/woocommerce-wirecard-checkout-seamless/classes/class-wirecard-backend-operations.php
index 108f072..f9e672c 100644
--- a/woocommerce-wirecard-checkout-seamless/classes/class-wirecard-backend-operations.php
+++ b/woocommerce-wirecard-checkout-seamless/classes/class-wirecard-backend-operations.php
@@ -86,12 +86,11 @@ public function __construct( $settings ) {
*
* @return bool|WP_Error
*/
- public function refund() {
+ public function refund( $order_id = 0, $amount = 0, $reason = '' ) {
global $wpdb;
$order_id = $_POST['order_id'];
$refund_amount = $_POST['refund_amount'];
-
if ( $refund_amount <= 0 ) {
$this->_logger->error( __( 'Refund amount must be greater than zero.', 'woocommerce-wirecard-checkout-seamless' ) );
@@ -132,59 +131,38 @@ public function refund() {
$basket = null;
-
if ( in_array( 'REFUND', $order->getOperationsAllowed() ) ) {
-
-
if (
(
- $tx_data->payment_method == WirecardCEE_QMore_PaymentType::INSTALLMENT
+ $tx_data->payment_method == WirecardCEE_Stdlib_PaymentTypeAbstract::INVOICE
&& $this->_settings['woo_wcs_invoiceprovider'] != 'payolution'
)
or
(
$tx_data->payment_method == WirecardCEE_QMore_PaymentType::INSTALLMENT
- && $this->_settings['woo_wcs_invoiceprovider'] != 'payolution'
+ && $this->_settings['woo_wcs_installmentprovider'] != 'payolution'
)
) {
if ( $total_items == 0 ) {
- // invoice / installment provider is set to ratepay / wirecard and basket items were not sent
- $this->_logger->error( __METHOD__ . ': basket needs to be defined for ' . $this->_settings['woo_wcs_invoiceprovider'] . ' during refund.' );
+ $basket = $this->create_basket_without_items( $refund_amount, $wc_order );
+ $order_data = $wc_order->get_data();
+ $response_with_basket = $this->get_client()->refund( $wcs_order_number, $order_data['total'], $order->getCurrency(), $basket );
+ if ( $response_with_basket->hasFailed() ) {
+ $this->logResponseErrors( __METHOD__, $response_with_basket->getErrors() );
+
+ return false;
+ } else {
+ return true;
+ }
+ }
+ $basket = $this->create_basket( $refund_items, $wc_order);
+ $response_with_basket = $this->get_client()->refund( $wcs_order_number, $refund_amount, $order->getCurrency(), $basket );
+ if ( $response_with_basket->hasFailed() ) {
+ $this->logResponseErrors( __METHOD__, $response_with_basket->getErrors() );
- return false;
+ return false;
} else {
- $basket = new WirecardCEE_Stdlib_Basket();
- foreach ( $refund_items as $item_id => $item ) {
- if ( $item['refund_qty'] < 1 ) {// $wc_order_items[ $item_id ] == null ) {
- continue;
- }
- $wc_product = new WC_Product( $wc_order_items[ $item_id ]->get_product_id() );
- $basket_item = new WirecardCEE_Stdlib_Basket_Item( $wc_product->get_id(), $item['refund_qty'] );
-
- $price = new stdClass();
- $price->net = wc_get_price_excluding_tax( $wc_product );
- $price->gross = wc_get_price_including_tax( $wc_product );
- $price->tax_amount = $price->gross - $price->net;
- $price->tax_rate = $price->tax_amount / $price->net;
-
- $basket_item->setName( $wc_product->get_name() )
- ->setDescription( $wc_product->get_short_description() )
- ->setImageUrl( wp_get_attachment_image_url( $wc_product->get_image_id() ) )
- ->setUnitNetAmount( wc_format_decimal( $price->net, wc_get_price_decimals() ) )
- ->setUnitGrossAmount( wc_format_decimal( $price->gross, wc_get_price_decimals() ) )
- ->setUnitTaxAmount( wc_format_decimal( $price->tax_amount, wc_get_price_decimals() ) )
- ->setUnitTaxRate( wc_format_decimal( $price->tax_rate, 3 ) );
-
- $basket->addItem( $basket_item );
- }
- $response_with_basket = $this->get_client()->refund( $wcs_order_number, $refund_amount, $order->getCurrency(), $basket );
- if ( $response_with_basket->hasFailed() ) {
- $this->logResponseErrors( __METHOD__, $response_with_basket->getErrors() );
-
- return false;
- } else {
- return true;
- }
+ return true;
}
} else {
@@ -216,6 +194,94 @@ public function refund() {
return false;
}
+ /**
+ * Create basket with items
+ *
+ * @since 1.0.16
+ *
+ * @param $refund_items
+ * @param $wc_order
+ * @return WirecardCEE_Stdlib_Basket
+ */
+ public function create_basket( $refund_items, $wc_order ) {
+ $wc_order_items = $wc_order->get_items();
+ $basket = new WirecardCEE_Stdlib_Basket();
+ $sum = 0;
+ foreach ( $wc_order_items as $item_id => $item ) {
+ if ( $refund_items[$item_id]['refund_qty'] < 1 ) {
+ continue;
+ }
+ $wc_product = new WC_Product( $wc_order_items[ $item_id ]->get_product_id() );
+
+ $article_nr = $wc_product->get_id();
+ if ( $wc_product->get_sku() != '' ) {
+ $article_nr = $wc_product->get_sku();
+ }
+
+ $sum += number_format( wc_get_price_including_tax( $wc_product ), wc_get_price_decimals() );
+ $basket_item = new WirecardCEE_Stdlib_Basket_Item( $article_nr, $refund_items[$item_id]['refund_qty'] );
+
+
+ $tax = wc_get_price_including_tax($wc_product) - wc_get_price_excluding_tax($wc_product);
+ $item_tax_rate = $tax / wc_get_price_excluding_tax( $wc_product );
+
+ $description = $wc_product->get_short_description();
+ $tax_rate = 0;
+ if ( $wc_product->is_taxable() ) {
+ $tax_rate = floatval(number_format( $item_tax_rate, 3 ));
+ }
+
+ $basket_item->setName( $wc_product->get_name() )
+ ->setDescription( $description )
+ ->setImageUrl( wp_get_attachment_image_url( $wc_product->get_image_id() ) )
+ ->setUnitNetAmount( wc_format_decimal( wc_get_price_excluding_tax( $wc_product ), wc_get_price_decimals() ) )
+ ->setUnitGrossAmount( wc_format_decimal( wc_get_price_including_tax( $wc_product ), wc_get_price_decimals() ) )
+ ->setUnitTaxAmount( wc_format_decimal( $tax, wc_get_price_decimals() ) )
+ ->setUnitTaxRate( $tax_rate * 100 );
+
+ $basket->addItem( $basket_item );
+ }
+ return $basket;
+ }
+
+ /**
+ * Create basket with items
+ *
+ * @since 1.0.16
+ *
+ * @param $refund_items
+ * @param $wc_order
+ * @return WirecardCEE_Stdlib_Basket
+ */
+ public function create_basket_without_items( $refund_amount, $wc_order ) {
+ $order_data = $wc_order->get_data();
+
+ $basket = new WirecardCEE_Stdlib_Basket();
+ $basket_item = new WirecardCEE_Stdlib_Basket_Item( 'Total refund ratepay' , 1);
+
+ $tax = $order_data['total_tax'];
+ $net = $order_data['total'] - $order_data['total_tax'];
+ $item_unit_gross_amount = $order_data['total'];
+ $item_tax_rate = $tax / $net;
+
+ $description = 'Refund full amount of order';
+ $tax_rate = 0;
+ if ($tax > 0) {
+ $tax_rate = floatval(number_format($item_tax_rate, 3));
+ }
+
+ $basket_item->setName('Full Refund Order')
+ ->setDescription($description)
+ ->setImageUrl()
+ ->setUnitNetAmount(wc_format_decimal($net, wc_get_price_decimals()))
+ ->setUnitGrossAmount(wc_format_decimal($item_unit_gross_amount, wc_get_price_decimals()))
+ ->setUnitTaxAmount(wc_format_decimal($tax, wc_get_price_decimals()))
+ ->setUnitTaxRate($tax_rate);
+ $basket->addItem($basket_item);
+
+ return $basket;
+ }
+
/**
* get the wirecard order details
*
diff --git a/woocommerce-wirecard-checkout-seamless/classes/class-wirecard-config.php b/woocommerce-wirecard-checkout-seamless/classes/class-wirecard-config.php
index 0766ae0..ca47a8f 100644
--- a/woocommerce-wirecard-checkout-seamless/classes/class-wirecard-config.php
+++ b/woocommerce-wirecard-checkout-seamless/classes/class-wirecard-config.php
@@ -31,7 +31,7 @@
*/
define( 'WOOCOMMERCE_GATEWAY_WCS_NAME', 'WirecardCheckoutSeamless' );
-define( 'WOOCOMMERCE_GATEWAY_WCS_VERSION', '1.0.15' );
+define( 'WOOCOMMERCE_GATEWAY_WCS_VERSION', '1.0.16' );
/**
* Config class
@@ -240,11 +240,11 @@ public function get_consumer_data( $order, $gateway, $checkout_data ) {
$user_data = get_userdata( $order->get_user_id() );
$consumerData->setEmail( isset( $user_data->user_email ) ? $user_data->user_email : '' );
- if ( $gateway->get_option( 'woo_wcs_forwardconsumerbillingdata' ) ) {
+ if ( $gateway->get_option( 'woo_wcs_forwardconsumerbillingdata' ) || $this->force_consumer_data( $checkout_data['wcs_payment_method'] ) ) {
$billing_address = $this->get_address_data( $order, 'billing' );
$consumerData->addAddressInformation( $billing_address );
}
- if ( $gateway->get_option( 'woo_wcs_forwardconsumershippingdata' ) ) {
+ if ( $gateway->get_option( 'woo_wcs_forwardconsumershippingdata' ) || $this->force_consumer_data( $checkout_data['wcs_payment_method'] ) ) {
$shipping_address = $this->get_address_data( $order, 'shipping' );
$consumerData->addAddressInformation( $shipping_address );
}
@@ -257,6 +257,50 @@ public function get_consumer_data( $order, $gateway, $checkout_data ) {
return $consumerData;
}
+ /**
+ * Force sending data for invoice and installment
+ *
+ * @param $payment_method
+ *
+ * @since 1.0.16
+ * @return bool
+ */
+ public function force_consumer_data( $payment_method ) {
+ switch ( $payment_method ) {
+ case WirecardCEE_Stdlib_PaymentTypeAbstract::INVOICE:
+ case WirecardCEE_Stdlib_PaymentTypeAbstract::INSTALLMENT:
+ return true;
+ default:
+ return false;
+ }
+ }
+
+ /**
+ * Force sending basket data for invoice and installment via ratepay
+ *
+ * @param $payment_method
+ * @param $gateway
+ *
+ * @since 1.0.16
+ * @return bool
+ */
+ public function force_basket_data( $payment_method, $gateway ) {
+ switch ( $payment_method ) {
+ case WirecardCEE_Stdlib_PaymentTypeAbstract::INVOICE:
+ if ( 'payolution' != $gateway->get_option('woo_wcs_invoiceprovider') ) {
+ return true;
+ }
+ return false;
+ case WirecardCEE_Stdlib_PaymentTypeAbstract::INSTALLMENT:
+ if ( 'payolution' != $gateway->get_option('woo_wcs_installmentprovider') ) {
+ return true;
+ }
+ return false;
+ default:
+ return false;
+ }
+ }
+
/**
* Generate address data (shipping or billing)
*
diff --git a/woocommerce-wirecard-checkout-seamless/classes/class-wirecard-gateway.php b/woocommerce-wirecard-checkout-seamless/classes/class-wirecard-gateway.php
index 45012e3..18cf3b6 100644
--- a/woocommerce-wirecard-checkout-seamless/classes/class-wirecard-gateway.php
+++ b/woocommerce-wirecard-checkout-seamless/classes/class-wirecard-gateway.php
@@ -403,7 +403,7 @@ public function process_refund( $order_id, $amount = null, $reason = '' ) {
$backend_operations = new WC_Gateway_Wirecard_Checkout_Seamless_Backend_Operations( $this->settings );
- return $backend_operations->refund();
+ return $backend_operations->refund( $order_id, $amount, $reason );
}
/**
@@ -565,7 +565,8 @@ public function initiate_payment( $order ) {
$client->setConfirmMail( get_bloginfo( 'admin_email' ) );
}
- if ( $this->get_option( 'woo_wcs_forwardbasketdata' ) ) {
+ if ( $this->get_option( 'woo_wcs_forwardbasketdata' )
+ || ( $this->_config->force_basket_data( $checkout_data['wcs_payment_method'], $this ) ) ) {
$client->setBasket( $this->_config->get_shopping_basket() );
}
diff --git a/woocommerce-wirecard-checkout-seamless/woocommerce-wirecard-checkout-seamless.php b/woocommerce-wirecard-checkout-seamless/woocommerce-wirecard-checkout-seamless.php
index a1a565e..baeb31c 100644
--- a/woocommerce-wirecard-checkout-seamless/woocommerce-wirecard-checkout-seamless.php
+++ b/woocommerce-wirecard-checkout-seamless/woocommerce-wirecard-checkout-seamless.php
@@ -3,7 +3,7 @@
* Plugin Name: Wirecard Checkout Seamless
* Plugin URI: https://github.com/wirecard/woocommerce-wcs
* Description: Wirecard Checkout Seamless plugin for WooCommerce
- * Version: 1.0.15
+ * Version: 1.0.16
* Author: Wirecard
* Author URI: https://www.wirecard.at/
* License: GPL2