Stop sending line items to Mijireh Fixes #5365

Like PayPal, Mijireh struggles with out prices including tax due to
rounding errors. Since the validation cannot be disabled, its better to
just send the order as 1 item. This will prevent rounding errors and
payment failures.

Prices excluding tax are unaffected.
This commit is contained in:
Mike Jolley 2014-05-01 15:29:28 +01:00
parent 78e9aed6c1
commit 97e0449bd8
1 changed files with 90 additions and 101 deletions

View File

@ -25,7 +25,6 @@ class WC_Gateway_Mijireh extends WC_Payment_Gateway {
* @return void * @return void
*/ */
public function __construct() { public function __construct() {
$this->id = 'mijireh_checkout'; $this->id = 'mijireh_checkout';
$this->method_title = __( 'Mijireh Checkout', 'woocommerce' ); $this->method_title = __( 'Mijireh Checkout', 'woocommerce' );
$this->icon = apply_filters( 'woocommerce_mijireh_checkout_icon', WC()->plugin_url() . '/includes/gateways/mijireh/assets/images/credit_cards.png' ); $this->icon = apply_filters( 'woocommerce_mijireh_checkout_icon', WC()->plugin_url() . '/includes/gateways/mijireh/assets/images/credit_cards.png' );
@ -83,9 +82,7 @@ class WC_Gateway_Mijireh extends WC_Payment_Gateway {
* @return void * @return void
*/ */
public function mijireh_notification() { public function mijireh_notification() {
if( isset( $_GET['order_number'] ) ) { if ( isset( $_GET['order_number'] ) ) {
global $woocommerce;
$this->init_mijireh(); $this->init_mijireh();
try { try {
@ -102,21 +99,17 @@ class WC_Gateway_Mijireh extends WC_Payment_Gateway {
wp_redirect( $this->get_return_url( $wc_order ) ); wp_redirect( $this->get_return_url( $wc_order ) );
exit; exit;
} catch (Mijireh_Exception $e) { } catch ( Mijireh_Exception $e ) {
wc_add_notice( __( 'Mijireh error:', 'woocommerce' ) . $e->getMessage(), 'error' ); wc_add_notice( __( 'Mijireh error:', 'woocommerce' ) . $e->getMessage(), 'error' );
} }
} }
elseif( isset( $_POST['page_id'] ) ) { elseif ( isset( $_POST['page_id'] ) ) {
if( isset( $_POST['access_key'] ) && $_POST['access_key'] == $this->access_key ) { if ( isset( $_POST['access_key'] ) && $_POST['access_key'] == $this->access_key ) {
wp_update_post( array( 'ID' => $_POST['page_id'], 'post_status' => 'private' ) ); wp_update_post( array( 'ID' => $_POST['page_id'], 'post_status' => 'private' ) );
} }
} }
} }
/** /**
* Initialise Gateway Settings Form Fields * Initialise Gateway Settings Form Fields
* *
@ -154,7 +147,6 @@ class WC_Gateway_Mijireh extends WC_Payment_Gateway {
); );
} }
/** /**
* Admin Panel Options * Admin Panel Options
* - Options for bits like 'title' and availability on a country-by-country basis * - Options for bits like 'title' and availability on a country-by-country basis
@ -184,7 +176,6 @@ class WC_Gateway_Mijireh extends WC_Payment_Gateway {
<?php <?php
} }
/** /**
* Process the payment and return the result * Process the payment and return the result
* *
@ -199,23 +190,35 @@ class WC_Gateway_Mijireh extends WC_Payment_Gateway {
$mj_order = new Mijireh_Order(); $mj_order = new Mijireh_Order();
$wc_order = new WC_Order( $order_id ); $wc_order = new WC_Order( $order_id );
// Avoid rounding issues altogether by sending the order as one lump
if ( get_option( 'woocommerce_prices_include_tax' ) == 'yes' ) {
// Don't pass items - Pass 1 item for the order items overall
$item_names = array();
if ( sizeof( $wc_order->get_items() ) > 0 ) {
foreach ( $wc_order->get_items() as $item ) {
if ( $item['qty'] ) {
$item_names[] = $item['name'] . ' x ' . $item['qty'];
}
}
}
$mj_order->add_item( sprintf( __( 'Order %s' , 'woocommerce'), $wc_order->get_order_number() ) . " - " . implode( ', ', $item_names ), number_format( $wc_order->get_total() - round( $wc_order->get_total_shipping() + $wc_order->get_shipping_tax(), 2 ) + $wc_order->get_order_discount(), 2, '.', '' ), 1 );
if ( ( $wc_order->get_total_shipping() + $wc_order->get_shipping_tax() ) > 0 ) {
$mj_order->shipping = number_format( $wc_order->get_total_shipping() + $wc_order->get_shipping_tax(), 2, '.', '' );
}
$mj_order->show_tax = false;
// No issues when prices exclude tax
} else {
// add items to order // add items to order
$items = $wc_order->get_items(); $items = $wc_order->get_items();
foreach( $items as $item ) { foreach( $items as $item ) {
$product = $wc_order->get_product_from_item( $item ); $product = $wc_order->get_product_from_item( $item );
if ( get_option( 'woocommerce_prices_include_tax' ) == 'yes' ) {
$mj_order->add_item( $item['name'], $wc_order->get_item_subtotal( $item, true, false ), $item['qty'], $product->get_sku() );
} else {
$mj_order->add_item( $item['name'], $wc_order->get_item_subtotal( $item, false, true ), $item['qty'], $product->get_sku() ); $mj_order->add_item( $item['name'], $wc_order->get_item_subtotal( $item, false, true ), $item['qty'], $product->get_sku() );
}
} }
// Handle fees // Handle fees
@ -225,6 +228,14 @@ class WC_Gateway_Mijireh extends WC_Payment_Gateway {
$mj_order->add_item( $item['name'], number_format( $item['line_total'], 2, '.', ',' ), 1, '' ); $mj_order->add_item( $item['name'], number_format( $item['line_total'], 2, '.', ',' ), 1, '' );
} }
$mj_order->shipping = round( $wc_order->get_total_shipping(), 2 );
$mj_order->tax = $wc_order->get_total_tax();
}
// set order totals
$mj_order->total = $wc_order->get_total();
$mj_order->discount = $wc_order->get_total_discount();
// add billing address to order // add billing address to order
$billing = new Mijireh_Address(); $billing = new Mijireh_Address();
$billing->first_name = $wc_order->billing_first_name; $billing->first_name = $wc_order->billing_first_name;
@ -237,8 +248,10 @@ class WC_Gateway_Mijireh extends WC_Payment_Gateway {
$billing->country = $wc_order->billing_country; $billing->country = $wc_order->billing_country;
$billing->company = $wc_order->billing_company; $billing->company = $wc_order->billing_company;
$billing->phone = $wc_order->billing_phone; $billing->phone = $wc_order->billing_phone;
if ( $billing->validate() )
if ( $billing->validate() ) {
$mj_order->set_billing_address( $billing ); $mj_order->set_billing_address( $billing );
}
// add shipping address to order // add shipping address to order
$shipping = new Mijireh_Address(); $shipping = new Mijireh_Address();
@ -251,26 +264,16 @@ class WC_Gateway_Mijireh extends WC_Payment_Gateway {
$shipping->zip_code = $wc_order->shipping_postcode; $shipping->zip_code = $wc_order->shipping_postcode;
$shipping->country = $wc_order->shipping_country; $shipping->country = $wc_order->shipping_country;
$shipping->company = $wc_order->shipping_company; $shipping->company = $wc_order->shipping_company;
if ( $shipping->validate() )
if ( $shipping->validate() ) {
$mj_order->set_shipping_address( $shipping ); $mj_order->set_shipping_address( $shipping );
}
// set order name // set order name
$mj_order->first_name = $wc_order->billing_first_name; $mj_order->first_name = $wc_order->billing_first_name;
$mj_order->last_name = $wc_order->billing_last_name; $mj_order->last_name = $wc_order->billing_last_name;
$mj_order->email = $wc_order->billing_email; $mj_order->email = $wc_order->billing_email;
// set order totals
$mj_order->total = $wc_order->get_total();
$mj_order->discount = $wc_order->get_total_discount();
if ( get_option( 'woocommerce_prices_include_tax' ) == 'yes' ) {
$mj_order->shipping = round( $wc_order->get_total_shipping() + $wc_order->get_shipping_tax(), 2 );
$mj_order->show_tax = false;
} else {
$mj_order->shipping = round( $wc_order->get_total_shipping(), 2 );
$mj_order->tax = $wc_order->get_total_tax();
}
// add meta data to identify woocommerce order // add meta data to identify woocommerce order
$mj_order->add_meta_data( 'wc_order_id', $order_id ); $mj_order->add_meta_data( 'wc_order_id', $order_id );
@ -287,12 +290,11 @@ class WC_Gateway_Mijireh extends WC_Payment_Gateway {
'redirect' => $mj_order->checkout_url 'redirect' => $mj_order->checkout_url
); );
return $result; return $result;
} catch (Mijireh_Exception $e) { } catch ( Mijireh_Exception $e ) {
wc_add_notice( __( 'Mijireh error:', 'woocommerce' ) . $e->getMessage(), 'error' ); wc_add_notice( __( 'Mijireh error:', 'woocommerce' ) . $e->getMessage() . print_r( $mj_order, true ), 'error' );
} }
} }
/** /**
* init_mijireh function. * init_mijireh function.
* *
@ -313,15 +315,12 @@ class WC_Gateway_Mijireh extends WC_Payment_Gateway {
} }
} }
/** /**
* page_slurp function. * page_slurp function.
* *
* @access public * @access public
* @return void
*/ */
public static function page_slurp() { public static function page_slurp() {
self::init_mijireh(); self::init_mijireh();
$page = get_page( absint( $_POST['page_id'] ) ); $page = get_page( absint( $_POST['page_id'] ) );
@ -334,17 +333,12 @@ class WC_Gateway_Mijireh extends WC_Payment_Gateway {
die; die;
} }
/** /**
* add_page_slurp_meta function. * add_page_slurp_meta function.
* *
* @access public * @access public
* @return void
*/ */
public static function add_page_slurp_meta() { public static function add_page_slurp_meta() {
global $woocommerce;
if ( self::is_slurp_page() ) { if ( self::is_slurp_page() ) {
wp_enqueue_style( 'mijireh_css', WC()->plugin_url() . '/includes/gateways/mijireh/assets/css/mijireh.css' ); wp_enqueue_style( 'mijireh_css', WC()->plugin_url() . '/includes/gateways/mijireh/assets/css/mijireh.css' );
wp_enqueue_script( 'pusher', 'https://d3dy5gmtp8yhk7.cloudfront.net/1.11/pusher.min.js', null, false, true ); wp_enqueue_script( 'pusher', 'https://d3dy5gmtp8yhk7.cloudfront.net/1.11/pusher.min.js', null, false, true );
@ -361,7 +355,6 @@ class WC_Gateway_Mijireh extends WC_Payment_Gateway {
} }
} }
/** /**
* is_slurp_page function. * is_slurp_page function.
* *
@ -380,17 +373,13 @@ class WC_Gateway_Mijireh extends WC_Payment_Gateway {
return $is_slurp; return $is_slurp;
} }
/** /**
* draw_page_slurp_meta_box function. * draw_page_slurp_meta_box function.
* *
* @access public * @access public
* @param mixed $post * @param mixed $post
* @return void
*/ */
public static function draw_page_slurp_meta_box( $post ) { public static function draw_page_slurp_meta_box( $post ) {
global $woocommerce;
self::init_mijireh(); self::init_mijireh();
echo "<div id='mijireh_notice' class='mijireh-info alert-message info' data-alert='alert'>"; echo "<div id='mijireh_notice' class='mijireh-info alert-message info' data-alert='alert'>";