From e4c51019eaa7ebc60ee24bccbf1f802b3f417bd3 Mon Sep 17 00:00:00 2001
From: Reinhold Kainhofer <reinhold@kainhofer.com>
Date: Fri, 20 Sep 2013 21:36:42 +0200
Subject: [PATCH] Version 3.3: Fix country checks; Fix arithmetic operators
 inside functions; add not operator

---
 Makefile                    |  2 +-
 rules_shipping.xml          |  2 +-
 rules_shipping_advanced.php |  2 +-
 rules_shipping_advanced.xml |  2 +-
 rules_shipping_base.php     | 27 ++++++++++++++++++---------
 5 files changed, 22 insertions(+), 13 deletions(-)

diff --git a/Makefile b/Makefile
index 14371bb..70aac48 100644
--- a/Makefile
+++ b/Makefile
@@ -2,7 +2,7 @@ BASE=rules_shipping
 BASE_ADV=rules_shipping_advanced
 PLUGINTYPE=vmshipment
 ZIPBASE=opentools_vm2
-VERSION=3.2
+VERSION=3.3
 
 PLUGINFILES=$(BASE).php $(BASE)_base.php $(BASE).script.php $(BASE).xml index.html
 PLUGINFILES_ADV=$(BASE_ADV).php $(BASE)_base.php $(BASE_ADV).script.php $(BASE_ADV).xml index.html
diff --git a/rules_shipping.xml b/rules_shipping.xml
index 2c97179..cf9ab5c 100644
--- a/rules_shipping.xml
+++ b/rules_shipping.xml
@@ -6,7 +6,7 @@
     <authorUrl>http://www.open-tools.net</authorUrl>
     <copyright>Copyright (C) 2013, Reinhold Kainhofer</copyright>
     <license>GPL v3+</license>
-    <version>3.2</version>
+    <version>3.3</version>
     <description>VMSHIPMENT_RULES_DESC</description>
     <files>
 	<filename plugin="rules_shipping">rules_shipping.php</filename>
diff --git a/rules_shipping_advanced.php b/rules_shipping_advanced.php
index a40fde6..5a1610a 100644
--- a/rules_shipping_advanced.php
+++ b/rules_shipping_advanced.php
@@ -283,7 +283,7 @@ class ShippingRule_Advanced extends ShippingRule {
 				while (count($stack)>0) { // 4a)
 					$op = array_pop ($stack);
 					// The only right-associative operator is =, which we allow at most once!
-					if ($op == "(") {
+					if ($op == "(" || $op == "FUNCTION(") {
 						// add it back to the stack!
 						array_push ($stack, $op);
 						break;
diff --git a/rules_shipping_advanced.xml b/rules_shipping_advanced.xml
index 3357816..4d14d95 100644
--- a/rules_shipping_advanced.xml
+++ b/rules_shipping_advanced.xml
@@ -6,7 +6,7 @@
     <authorUrl>http://www.open-tools.net</authorUrl>
     <copyright>Copyright (C) 2013, Reinhold Kainhofer</copyright>
     <license>GPL v3+</license>
-    <version>3.2</version>
+    <version>3.3</version>
     <description>VMSHIPMENT_RULES_ADV_DESC</description>
     <files>
 	<filename plugin="rules_shipping_advanced">rules_shipping_advanced.php</filename>
diff --git a/rules_shipping_base.php b/rules_shipping_base.php
index 57fb848..4161138 100644
--- a/rules_shipping_base.php
+++ b/rules_shipping_base.php
@@ -431,22 +431,26 @@ class plgVmShipmentRules_Shipping_Base extends vmPSPlugin {
 		
 		$countriesModel = VmModel::getModel('country');
 		if (isset($address['virtuemart_country_id'])) {
+			$data['countryid'] = $address['virtuemart_country_id'];
 			$countriesModel->setId($address['virtuemart_country_id']);
 			$country = $countriesModel->getData();
-			$data['countryid'] = $country->virtuemart_country_id;
-			$data['country'] = $country->country_name;
-			$data['country2'] = $country->country_2_code;
-			$data['country3'] = $country->country_3_code;
+			if (isset($country)) {
+				$data['country'] = $country->country_name;
+				$data['country2'] = $country->country_2_code;
+				$data['country3'] = $country->country_3_code;
+			}
 		}
 		
 		$statesModel = VmModel::getModel('state');
 		if (isset($address['virtuemart_state_id'])) {
+			$data['stateid'] = $address['virtuemart_state_id'];
 			$statesModel->setId($address['virtuemart_state_id']);
 			$state = $statesModel->getData();
-			$data['stateid'] = $state->virtuemart_state_id;
-			$data['state'] = $state->state_name;
-			$data['state2'] = $state->state_2_code;
-			$data['state3'] = $state->state_3_code;
+			if (isset($state)) {
+				$data['state'] = $state->state_name;
+				$data['state2'] = $state->state_2_code;
+				$data['state3'] = $state->state_3_code;
+			}
 		}
 		
 		return $data;
@@ -483,6 +487,8 @@ class plgVmShipmentRules_Shipping_Base extends vmPSPlugin {
 				  'pricewithouttax'=>$cart_prices['priceWithoutTax'],
 				  
 				  'skus'=>$this->getOrderSKUs($cart),
+				  // TODO: Add 'categories' variable
+				  // TODO: Add 'vendors'variable
 // 				  'discountbeforetaxbill'=>$cart_prices['discountBeforeTaxBill'],
 			);
 		
@@ -769,6 +775,7 @@ class ShippingRule {
 				case "ceil":  return ceil ($args[0]); break;
 				case "floor": return floor($args[0]); break;
 				case "abs":   return abs($args[0]); break;
+				case "not":   return !$args[0]; break;
 			}
 		}
 		// Functions with variable number of args
@@ -874,8 +881,10 @@ class ShippingRule {
 
 	function matches($vals) {
 		// First, check the country, if any conditions are given:
-		if (count ($this->countries) > 0 && !in_array ($vals['countryid'], $this->countries))
+		if (count ($this->countries) > 0 && !in_array ($vals['countryid'], $this->countries)) {
+// 			vmdebug('Rule::matches: Country check failed: countryid='.print_r($vals['countryid'],1).', countries are: '.print_r($this->countries,1).'...');
 			return False;
+		}
 		
 		foreach ($this->conditions as $c) {
 			// All conditions have to match!
-- 
GitLab