From 3304c12746dbc9033da11d60709620bb87a91523 Mon Sep 17 00:00:00 2001
From: Reinhold Kainhofer <reinhold@kainhofer.com>
Date: Sat, 25 Jul 2015 21:38:52 +0200
Subject: [PATCH] First working version of the plugin...

---
 assets/css/admin-styles.css                   |  6 +-
 assets/css/shipping-rules-config.css          |  4 --
 .../admin/settings/meta-box-field-ruleset.php | 10 +--
 includes/admin/settings/meta-box-rulesets.php |  3 +-
 includes/rules-shipping-method.php            | 62 ++++++----------
 includes/rules-shipping-post-type.php         | 64 ++++-------------
 .../rules_shipping_framework_woocommerce.php  | 70 +++++++++++--------
 library/rules_shipping_framework.php          | 48 +++++++++----
 shipping-by-rules.php                         | 20 ++----
 9 files changed, 120 insertions(+), 167 deletions(-)

diff --git a/assets/css/admin-styles.css b/assets/css/admin-styles.css
index 45398e9..ecade0a 100644
--- a/assets/css/admin-styles.css
+++ b/assets/css/admin-styles.css
@@ -11,8 +11,8 @@ table.rules_shipping_methods.widefat {
 div.shipping_rules_ruleset {
 	background: #f8f8f8;
 	border: #D0D0D0 1px solid;
-	margin-bottom: 10px;
-	margin-top: 10px;
+	margin-bottom: 20px;
+	margin-top: 20px;
 }
 
 #shipping_rules_rulesets .ruleset_openclose {
@@ -26,7 +26,7 @@ div.shipping_rules_ruleset {
 }
 
 #shipping_rules_rulesets .shipping_rules_ruleset.closed .ruleset_openclose:before {
-  content: '\f141';
+  content: '\f140';
 }
 #shipping_rules_rulesets .shipping_rules_ruleset .ruleset_openclose:before {
   content: '\f142';
diff --git a/assets/css/shipping-rules-config.css b/assets/css/shipping-rules-config.css
index 8d21ef0..e69de29 100644
--- a/assets/css/shipping-rules-config.css
+++ b/assets/css/shipping-rules-config.css
@@ -1,4 +0,0 @@
-media="all"
-.woocommerce_page_wc-settings .rules_shipping_methods .add.button:before {
-  content: "";
-}
\ No newline at end of file
diff --git a/includes/admin/settings/meta-box-field-ruleset.php b/includes/admin/settings/meta-box-field-ruleset.php
index 49f1a53..f1c47dc 100644
--- a/includes/admin/settings/meta-box-field-ruleset.php
+++ b/includes/admin/settings/meta-box-field-ruleset.php
@@ -67,14 +67,6 @@ function render_meta_box_shipping_rules_single_ruleset ($post, $nr, $ruleset) {
 
 				/** Rules */
 				$option_value = isset($ruleset['rules'])?$ruleset['rules']:'';
-// $option_value='Name=Whatever; Amount>35; Shipping=5
-// Name=2; contains_only(SKUs, "asdf"); Shipping=33
-// State2=="AZ"; NoShipping
-// Amount<5; Shipping=333
-// ZIP==4321; Shipping=3
-// ZIP==9999; Shipping=15
-// Shipping=0
-// ';
 				$nrrules = count(explode("\n", $option_value));
 				$value = array(
 					'id' =>		$id.'[rules]',
@@ -82,7 +74,7 @@ function render_meta_box_shipping_rules_single_ruleset ($post, $nr, $ruleset) {
 					'type' =>	'textarea',
 					'css' =>	'',
 					'class' =>	'shipping_rules_rule_textarea',
-					'placeholder'	=> __('Rules of the form:\nName="Rule name"; Amount>100; [...Conditions...]; Shipping=3', 'opentools-shippingrules'),
+					'placeholder'	=> __('Rules of the form: Name="Rule name"; Amount>100; [...Conditions...]; Shipping=3', 'opentools-shippingrules'),
 				);
 				$custom_attributes = array( 
 					'rows="'.absint(max($nrrules,5)).'"',
diff --git a/includes/admin/settings/meta-box-rulesets.php b/includes/admin/settings/meta-box-rulesets.php
index fae0234..e0a54fc 100644
--- a/includes/admin/settings/meta-box-rulesets.php
+++ b/includes/admin/settings/meta-box-rulesets.php
@@ -18,7 +18,7 @@ function render_meta_box_shipping_rules_rulesets ($post, $rulesets) {
 
 wp_nonce_field( 'shipping_rules_rulesets_meta_box', 'shipping_rules_rulesets_meta_box_nonce' );
 
-?><div class='shipping_rules shipping_rules_rulesets shipping_rules_meta_box shipping_rules_rulesets_meta_box'>
+?><div class='shipping_rules shipping_rules_rulesets shipping_rules_meta_box shipping_rules_rulesets_meta_box ui-sortable'>
 <pre><?php //print_r($rulesets); ?></pre>
 	<?php 
 	require_once plugin_dir_path( __FILE__ ) . 'meta-box-field-ruleset.php';
@@ -33,6 +33,7 @@ wp_nonce_field( 'shipping_rules_rulesets_meta_box', 'shipping_rules_rulesets_met
 	jQuery(document).ready(function($){
 // 		$( '.shipping_rules .chzn-select' ).chosen();
 		$('.shipping_rules .select2').select2();
+		$('.shipping_rules_rulesets_meta_box.ui-sortable').sortable();
 	});
 </script>
 		
diff --git a/includes/rules-shipping-method.php b/includes/rules-shipping-method.php
index 8828fc7..b88dd55 100644
--- a/includes/rules-shipping-method.php
+++ b/includes/rules-shipping-method.php
@@ -8,7 +8,7 @@
  * License: GPLv3+
 */
 
-class WC_Shipping_by_Rules extends WC_Shipping_Method {
+class Shipping_by_Rules extends WC_Shipping_Method {
 	protected $helper = null;
 	/**
 	 * Constructor for your shipping class
@@ -21,7 +21,6 @@ class WC_Shipping_by_Rules extends WC_Shipping_Method {
 			require_once( plugin_dir_path( __FILE__ ) . '/rules_shipping_framework_woocommerce.php');
 		}
 		$this->helper = RulesShippingFrameworkWooCommerce::getHelper();
-		$this->shipping_rules_option	= 'woocommerce_shipping_rules_ordering';
 		
 		$this->id						= 'shipping_by_rules'; // Id for your shipping method. Should be uunique.
 		$this->title  					= $this->helper->__( 'Shipping By Rules <small>(displayed title changes according to configured methods)</small>');
@@ -38,8 +37,6 @@ class WC_Shipping_by_Rules extends WC_Shipping_Method {
 	 * @return void
 	 */
 	function init() {
-// 		$this->get_rule_shipping_methods();
-		
 		$this->init_form_fields();
 		$this->init_settings();
 
@@ -50,26 +47,6 @@ class WC_Shipping_by_Rules extends WC_Shipping_Method {
 		add_action( 'woocommerce_update_options_shipping_' . $this->id, array( $this, 'process_shipping_rules_sorting' ) );
 	}
 
-	/**
-	* get_shipping_rules_methods function.
-	*/
-	public function get_rule_shipping_methods() {
-		$unsortedmethods = get_posts (array ('posts_per_page' => '-1', 'post_type' => 'shipping_rules'));
-		$ordering = get_option( $this->shipping_rules_option );
-		$methods = array();
-		foreach ($ordering as $o) {
-			foreach ($unsortedmethods as $key=>$m) {
-				if ($m->ID == $o) {
-					$methods[$o] = $m;
-					unset($unsortedmethods[$key]);
-					break;
-				}
-			}
-		}
-		$methods = $methods + $unsortedmethods;
-		return $methods;
-	}
-
 	/**
 	* Initialise Gateway Settings Form Fields
 	*
@@ -121,12 +98,9 @@ class WC_Shipping_by_Rules extends WC_Shipping_Method {
 	 */
 	public function process_shipping_rules_sorting() {
 		$ordering = isset($_POST[ 'rules_method_order']) ? array_map( 'wc_clean', $_POST[ 'rules_method_order'] ) : array();
-		update_option( $this->shipping_rules_option, $ordering );
-
-		$this->get_rule_shipping_methods();
+		$this->helper->set_method_ordering($ordering);
 	}
 
-
  
 	/**
 	 * calculate_shipping function.
@@ -136,18 +110,24 @@ class WC_Shipping_by_Rules extends WC_Shipping_Method {
 	 * @return void
 	 */
 	public function calculate_shipping( $package ) {
-		$cost = $this->helper->getCosts($package, $this);
-		// TODO!
-// print("<pre>Helper: ".print_r($helper,1)."</pre>");
-// print($t);
-// 		$rate = array(
-// 			'id' => $this->id,
-// 			'label' => "Test rule",
-// 			'cost' => '11.99',
-// 			'calc_tax' => 'per_item'
-// 		);
- 
-		// Register the rate
-// 		$this->add_rate( $rate );
+		$methods = $this->helper->get_rule_shipping_methods();
+		foreach ($methods as $method) {
+
+			$rates = $this->helper->getCosts($package, $method);
+			foreach ($rates as $r) {
+				$label = $r['name'];
+				if (isset($r['rulename']) && !empty($r['rulename'])) {
+					$label .= ' (' . $r['rulename'] . ')';
+				}
+				$rate = array(
+					'id' => $r['method'],
+					'label' => $label,
+					'cost' => $r['cost'],
+// 					'calc_tax' => 'per_item',
+				);
+				// Register the rate
+				$this->add_rate( $rate );
+			}
+		}
 	}
 }
diff --git a/includes/rules-shipping-post-type.php b/includes/rules-shipping-post-type.php
index 9e0cbbb..a2a52d7 100644
--- a/includes/rules-shipping-post-type.php
+++ b/includes/rules-shipping-post-type.php
@@ -5,7 +5,7 @@ if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
  *
  * Initialize the Shipping by Rules post type (to configure the .
  *
- * @class       
+ * @class       Shipping_Rules_post_type
  * @author      Reinhold Kainhofer
  * @package		WooCommerce (Advanced) Shipping By Rules
  * @version		1.0.0
@@ -14,31 +14,6 @@ if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
  * Based in part on WAFS_post_type (WooCommerce Advanced Free Shipping plugin)
  * (C) Jeroen Sormani, Licensed under the GPL V3+
  */
- 
-/*global $notices;
-$notices = array();
-function my_add_notice($message, $type) {
-	global $notices;
-	$notices[] = array('type'=>$type, 'message'=>$message);
-}
-function print_notices() {
-	global $notices;
-	?>
-	<div class="error"><pre><?php print_r($notices); ?></pre></div>
-	<?php
-	foreach ($notices as $msg) {
-		file_put_contents("/vagrant/httpdocs/test.log",$msg['message'], FILE_APPEND);
-
-    ?>
-    <div class="updated">
-        <p><?php echo $msg["message"]; ?></p>
-    </div>
-    <?php
-	}
-	$notices = array();
-}
-add_action('admin_notices', 'print_notices');
-*/
 
 class Shipping_Rules_post_type {
 
@@ -160,6 +135,15 @@ class Shipping_Rules_post_type {
 		return $messages;
 
 	}
+	
+	public static function get_rulesets($post) {
+		$rulesets = get_post_meta( $post->ID, '_rules_shipping_ruleset', true );
+		if (!is_array($rulesets)) {
+			$rulesets = array();
+		}
+		return $rulesets;
+	}
+
 
 	/**
 	 * Add meta boxes.
@@ -191,10 +175,8 @@ class Shipping_Rules_post_type {
 	 * @since 1.0.0
 	 */
 	public function render_shipping_rulesets($post, $metabox) {
+		$rulesets = $this->get_rulesets($post);
 		require_once plugin_dir_path( __FILE__ ) . 'admin/settings/meta-box-rulesets.php';
-		$rulesets = get_post_meta( $post->ID, '_rules_shipping_ruleset', true );
-// file_put_contents("/vagrant/httpdocs/test.log","render_shipping_rulesets called, id=$post->ID, rulesets=".print_r($rulesets,1)."\n\n\n\n\n", FILE_APPEND);
-
 		render_meta_box_shipping_rules_rulesets ($post, $rulesets);
 	}
 	
@@ -241,9 +223,6 @@ class Shipping_Rules_post_type {
 	 * @since 1.0.0
 	 */
 	public function shipping_rules_save_rulesets_meta( $post_id ) {
-// my_add_notice( "shipping_rules_save_rulesets_meta called", 'info');
-// file_put_contents("/vagrant/httpdocs/test.log","shipping_rules_save_rulesets_meta called, id=$post_id\n", FILE_APPEND);
-
 		if ( ! isset( $_POST['shipping_rules_rulesets_meta_box_nonce'] ) || ! wp_verify_nonce( $_POST['shipping_rules_rulesets_meta_box_nonce'], 'shipping_rules_rulesets_meta_box' ) ) :
 			return $post_id;
 		endif;
@@ -256,19 +235,14 @@ class Shipping_Rules_post_type {
 			return $post_id;
 		endif;
 
-// file_put_contents("/vagrant/httpdocs/test.log","shipping_rules_save_rulesets_meta, id=$post_id, checks passed\n", FILE_APPEND);
 		$shipping_method_rulesets = $_POST['_rules_shipping_ruleset'];
 		$shipping_method_ordering = $_POST['_rules_shipping_ordering'];
-		
-// file_put_contents("/vagrant/httpdocs/test.log","shipping_rules_save_rulesets_meta, id=$post_id, ordering: ".print_r($shipping_method_ordering,1)."\n\n\n\n", FILE_APPEND);
-// file_put_contents("/vagrant/httpdocs/test.log","shipping_rules_save_rulesets_meta, id=$post_id, ruleset: ".print_r($shipping_method_rulesets,1)."\n\n\n\n", FILE_APPEND);
 
 		$rulesets = array();
 		foreach ($shipping_method_ordering as $o) {
 			$rulesets[] = $shipping_method_rulesets[$o];
 		}
 
-file_put_contents("/vagrant/httpdocs/test.log","shipping_rules_save_rulesets_meta, id=$post_id, Sorted rulesets: ".print_r($shipping_method_rulesets,1)."\n\n\n\n", FILE_APPEND);
 		update_post_meta( $post_id, '_rules_shipping_ruleset', $rulesets );
 
 	}
@@ -282,7 +256,6 @@ file_put_contents("/vagrant/httpdocs/test.log","shipping_rules_save_rulesets_met
 	 * @since 1.0.0
 	 */
 	public function shipping_rules_save_meta( $post_id ) {
-// my_add_notice( "shipping_rules_save_meta called", 'info');
 
 		if ( ! isset( $_POST['shipping_rules_settings_meta_box_nonce'] ) || ! wp_verify_nonce( $_POST['shipping_rules_settings_meta_box_nonce'], 'shipping_rules_settings_meta_box' ) ) :
 			return $post_id;
@@ -312,20 +285,13 @@ file_put_contents("/vagrant/httpdocs/test.log","shipping_rules_save_rulesets_met
 	 * @since 1.0.0
 	 */
 	public function shipping_rules_redirect_after_trash() {
-
 		$screen = get_current_screen();
-
-		if( 'edit-shipping_rules' == $screen->id ) :
-
-			if( isset( $_GET['trashed'] ) &&  intval( $_GET['trashed'] ) > 0 ) :
-
+		if ('edit-shipping_rules' == $screen->id ) {
+			if (isset( $_GET['trashed'] ) &&  intval( $_GET['trashed'] ) > 0 ) {
 				wp_redirect( admin_url( '/admin.php?page=wc-settings&tab=shipping&section=shipping_by_rules' ) );
 				exit();
-
-			endif;
-
-		endif;
-
+			}
+		}
 	}
 
 
diff --git a/includes/rules_shipping_framework_woocommerce.php b/includes/rules_shipping_framework_woocommerce.php
index 3b80c62..e795d85 100644
--- a/includes/rules_shipping_framework_woocommerce.php
+++ b/includes/rules_shipping_framework_woocommerce.php
@@ -12,10 +12,11 @@ if ( !defined( 'ABSPATH' ) ) {
 require_once( plugin_dir_path( __FILE__ ) . '/../library/rules_shipping_framework.php');
 
 class RulesShippingFrameworkWooCommerce extends RulesShippingFramework {
+	protected static $_method_ordering	= 'woocommerce_shipping_rules_ordering';
+	
 	function _construct() {
 		parent::_construct();
 		load_plugin_textdomain('opentools-shippingrules', false, basename( dirname( __FILE__ ) ) . '/languages' );
-
 	}
 	static function getHelper() {
 		static $helper = null;
@@ -79,45 +80,26 @@ class RulesShippingFrameworkWooCommerce extends RulesShippingFramework {
 		}
 	}
 
-	protected function setMethodCosts($method, $match, $costs) {
-		// Allow some system-specific code, e.g. setting some members of $method, etc.
-		$title = $method->title;
-		if ($match["rule_name"]) {
-			$title .=  " (".$match["rule_name"].")";
-		}
-
-		$rate = array(
-			'id' => $method->id,
-			'label' => $title,
-			'cost' => $costs,
-// 			'calc_tax' => 'per_item'
-		);
-		// Register the rate
-		$this->add_rate( $rate );
-	}
-	
 	protected function getCartProducts($package, $method) {
 		return $package['contents'];
 	}
 	
 	protected function getMethodId($method) {
-		return $method->id;
+		return $method->ID;
 	}
 
 	protected function getMethodName($method) {
-		// Shall we use title or method_title?
-		return $method->title;
+		return $method->post_title;
 	}
 
 	protected function parseMethodRules (&$method) {
-		if (!isset($method->settings) || !isset($method->settings->rulesets)) {
-			return;
-		}
-		foreach ($method->settings->rulesets as $ruleset) {
-			$this->parseMethodRule($ruleset->rule, 
-				$method->countries /* TODO: or use a custom setting of $ruleset? */,
-				array(),
-				$method);
+		$rulesets = Shipping_Rules_post_type::get_rulesets($method);
+		foreach ($rulesets as $ruleset) {
+			$this->parseMethodRule(
+				/* Rules */    isset($ruleset['rules'])?$ruleset['rules']:'', 
+				/* Countries */isset($ruleset['countries'])?$ruleset['countries']:array(), 
+				/* Rule info */array(), 
+				/* Method */   $method);
 		}
 	}
 
@@ -251,6 +233,8 @@ class RulesShippingFrameworkWooCommerce extends RulesShippingFramework {
 		$data['fax'] = isset($address['fax'])?$address['fax']:'';
 		$data['email'] = isset($address['email'])?$address['email']:'';
 */
+		// The country check needs the countryid variable, so duplicate from country:
+		$data['countryid'] = $data['country'];
 		return $data;
 	}
 	
@@ -302,4 +286,32 @@ class RulesShippingFrameworkWooCommerce extends RulesShippingFramework {
 		return $result;
 	}
 	
+	/**
+	* get_shipping_rules_methods function.
+	*/
+	static public function get_rule_shipping_methods() {
+		$unsortedmethods = get_posts (array ('posts_per_page' => '-1', 'post_type' => 'shipping_rules'));
+		$ordering = get_option( self::$_method_ordering );
+		$methods = array();
+		foreach ($ordering as $o) {
+			foreach ($unsortedmethods as $key=>$m) {
+				if ($m->ID == $o) {
+					$methods[$o] = $m;
+					unset($unsortedmethods[$key]);
+					break;
+				}
+			}
+		}
+		$methods = $methods + $unsortedmethods;
+		return $methods;
+	}
+	
+	static public function set_method_ordering($ordering) {
+		update_option( self::$_method_ordering, $ordering );
+	}
+
+	protected function createMethodRule ($r, $countries, $ruleinfo) {
+		return new ShippingRule_Advanced($this, $r, $countries, $ruleinfo);
+	}
+
 }
diff --git a/library/rules_shipping_framework.php b/library/rules_shipping_framework.php
index b80baf9..71c72d1 100644
--- a/library/rules_shipping_framework.php
+++ b/library/rules_shipping_framework.php
@@ -279,8 +279,6 @@ class RulesShippingFramework {
 	 *  defines shipping costs (or uses NoShipping). If a modifier or definition is encountered,
 	 *  its effect is stored, but the loop continues */
 	protected function evaluateMethodRules ($cart, $method) {
-// print("<pre>Inside evaluateMethodRules: ".print_r($cart,1)."</pre>");
-// $this->warning("<pre>Inside evaluateMethodRules: ".print_r($cart,1)."</pre>");
 		$id = $this->getMethodId($method);
 		// $this->match will cache the matched rule and the modifiers
 		if (isset($this->match[$id])) {
@@ -288,7 +286,6 @@ class RulesShippingFramework {
 		} else {
 			// Evaluate all rules and find the matching ones (including modifiers and definitions!)
 			$cartvals = $this->getCartValues ($cart, $this->getCartProducts($cart, $method), $method);
-$this->warning("<pre>Cart Values: ".print_r($cartvals,1)."</pre>");
 			$result = array(
 				"rule" => Null,
 				"rule_name" => "",
@@ -303,7 +300,7 @@ $this->warning("<pre>Cart Values: ".print_r($cartvals,1)."</pre>");
 			};
 			if (isset($this->rules[$id])) {
 				foreach ($this->rules[$id] as $r) {
-					if ($r->matches($cartvals, $cart->products, $cartvals_callback)) {
+					if ($r->matches($cartvals, $this->getCartProducts($cart, $method), $cartvals_callback)) {
 						$rtype = $r->getType();
 						switch ($rtype) {
 							case 'shipping': 
@@ -336,6 +333,18 @@ $this->warning("<pre>Cart Values: ".print_r($cartvals,1)."</pre>");
 		return NULL;
 	}
 
+	protected function handleNoShipping($match, $method) {
+		if ($match['rule']->isNoShipping()) {
+			if (!empty($match["rule_name"]))
+				$this->warning('OTSHIPMENT_RULES_NOSHIPPING_MESSAGE', $match["rule_name"]);
+			$name = $this->getMethodName($method);
+			$this->debug('checkConditions '.$name.' indicates NoShipping for this method, specified by rule "'.$match["rule_name"].'" ('.$match['rule']->rulestring.').');
+			return true;
+		} else {
+			return false;
+		}
+	}
+	
 	/**
 	 * @param $cart
 	 * @param int             $method
@@ -346,19 +355,16 @@ $this->warning("<pre>Cart Values: ".print_r($cartvals,1)."</pre>");
 		$name = $this->getMethodName($method);
 		if (!isset($this->rules[$id])) 
 			$this->parseMethodRules($method);
+		// TODO: This needs to be redone sooner or later!
 		$match = $this->evaluateMethodRules ($cart, $method);
 		if ($match && !is_null ($match['rule'])) {
 			$this->setMethodCosts($method, $match, null);
 			// If NoShipping is set, this method should NOT offer any shipping at all, so return FALSE, otherwise TRUE
 			// If the rule has a name, print it as warning (otherwise don't print anything)
-			if ($match['rule']->isNoShipping()) {
-				if (!empty($match["rule_name"]))
-					$this->warning('OTSHIPMENT_RULES_NOSHIPPING_MESSAGE', $match["rule_name"]);
-				$this->debug('checkConditions '.$name.' indicates NoShipping for this method, specified by rule "'.$match["rule_name"].'" ('.$match['rule']->rulestring.').');
+			if ($this->handleNoShipping($match, $method)) {
 				return FALSE;
-			} else {
-				return TRUE;
 			}
+			return TRUE;
 		}
 		$this->debug('checkConditions '.$name.' does not fulfill all conditions, no rule matches');
 		return FALSE;
@@ -377,12 +383,16 @@ $this->warning("<pre>Cart Values: ".print_r($cartvals,1)."</pre>");
 	 * @return int
 	 */
 	function getCosts ($cart, $method) {
-		// TODO: Return an array with the method/rule name etc.
+		$results = array();
 		$id = $this->getMethodId($method);
 		if (!isset($this->rules[$id])) 
 			$this->parseMethodRules($method);
 		$match = $this->evaluateMethodRules ($cart, $method);
 		if ($match) {
+			if ($this->handleNoShipping($match, $method)) {
+				return $results;
+			}
+		
 			$r = $match["rule"];
 			$this->debug('Rule ' . $match["rule_name"] . ' ('.$r->rulestring.') matched.');
 
@@ -398,11 +408,20 @@ $this->warning("<pre>Cart Values: ".print_r($cartvals,1)."</pre>");
 			}
 			$this->setMethodCosts($method, $match, $cost);
 
-			return $cost;
+			$res = array(
+				'method' =>   $id,
+				'name' =>     $this->getMethodName($method),
+// 				'rulesetname'=>$match['ruleset_name'],
+				'rulename' => $match["rule_name"],
+				'cost' =>     $cost,
+			);
+			$results[] = $res;
 		}
 		
-		$this->debug('getCosts '.$this->getMethodName($method).' does not return shipping costs');
-		return 0;
+		if (empty($results)) {
+			$this->debug('getCosts '.$this->getMethodName($method).' does not return shipping costs');
+		}
+		return $results;
 	}
 	
 	public function getRuleName($methodid) {
@@ -539,7 +558,6 @@ class ShippingRule {
 
 		// Split at all operators:
 		$atoms = $this->tokenize_expression ($rulepart);
-		
 		/* Starting from here, the advanced plugin is different! */
 		$operators = array('<', '<=', '=', '>', '>=', '=>', '=<', '<>', '!=', '==');
 		if (count($atoms)==1) {
diff --git a/shipping-by-rules.php b/shipping-by-rules.php
index 6b054e2..5d58f96 100644
--- a/shipping-by-rules.php
+++ b/shipping-by-rules.php
@@ -95,13 +95,10 @@ class WooCommerce_Shipping_By_Rules {
 	 * @return object Instance of the class.
 	 */
 	public static function instance() {
-
 		if ( is_null( self::$instance ) ) {
 			self::$instance = new self();
 		}
-
 		return self::$instance;
-
 	}
 
 
@@ -113,19 +110,11 @@ class WooCommerce_Shipping_By_Rules {
 	 * @since 1.0.0
 	 */
 	public function init() {
-
-		// Add hooks/filters
 		$this->hooks();
-
-		// Load textdomain
 		$this->load_textdomain();
-
-		// Updater
 		$this->update();
 
-		/**
-		 * Require file with shipping_by_rules post type definition.
-		 */
+		// Shipping method post type definition:
 		require_once plugin_dir_path( __FILE__ ) . 'includes/rules-shipping-post-type.php';
 		$this->post_type = new Shipping_Rules_post_type();
 
@@ -202,7 +191,7 @@ class WooCommerce_Shipping_By_Rules {
 	 */
 	public function shipping_by_rules_init() {
 		require_once plugin_dir_path( __FILE__ ) . 'includes/rules-shipping-method.php';
-		$this->was_method = new WC_Shipping_by_Rules();
+		$this->rule_shipping_method = new Shipping_by_Rules();
 
 	}
 
@@ -215,8 +204,8 @@ class WooCommerce_Shipping_By_Rules {
 	 * @since 1.0.0
 	 */
 	public function shipping_by_rules_add_shipping_method( $methods ) {
-		if ( class_exists( 'WC_Shipping_by_Rules' ) ) :
-			$methods[] = 'WC_Shipping_by_Rules';
+		if ( class_exists( 'Shipping_by_Rules' ) ) :
+			$methods[] = 'Shipping_by_Rules';
 		endif;
 		// TODO: Figure out a way to add each shipping by rules method as a
 		// separate WooCommerce shipping method (ie. their order can be
@@ -237,7 +226,6 @@ class WooCommerce_Shipping_By_Rules {
 		// For some strange reason, WC does not define the select2.css style...
 		$assets_path          = str_replace( array( 'http:', 'https:' ), '', WC()->plugin_url() ) . '/assets/';
 		wp_enqueue_style( 'select2', $assets_path . 'css/select2.css' );
-// 		wp_enqueue_style( 'chosen', $assets_path . 'css/chosen.css' );
 
 		wp_enqueue_style( 'shipping_by_rules-style', plugins_url( 'assets/css/admin-styles.css', __FILE__ ), array('select2'), $this->version );
 		wp_enqueue_script( 'shipping-by-rules-config', plugins_url( 'assets/js/shipping-by-rules-config.js', __FILE__ ), array( 'jquery', 'jquery-ui-sortable', 'select2', 'wc-enhanced-select' ), $this->version, true );
-- 
GitLab