From 66aa27da21f45b2ac85ab87b883749b9f6468206 Mon Sep 17 00:00:00 2001
From: Reinhold Kainhofer <reinhold@kainhofer.com>
Date: Sat, 23 Mar 2013 14:05:57 +0100
Subject: [PATCH] First attempts at returning multiple rates...

---
 Makefile                                      |  2 +-
 .../en-GB.plg_vmshipment_rules_shipping.ini   |  8 +++
 rules_shipping.xml                            |  1 +
 rules_shipping_advanced.xml                   |  6 ++
 rules_shipping_base.php                       | 60 +++++++++++--------
 5 files changed, 51 insertions(+), 26 deletions(-)

diff --git a/Makefile b/Makefile
index f5a38f7..b5a8095 100644
--- a/Makefile
+++ b/Makefile
@@ -1,7 +1,7 @@
 BASE=rules_shipping
 BASE_ADV=rules_shipping_advanced
 PLUGINTYPE=vmshipment
-VERSION=2.2.0
+VERSION=2.3.0
 
 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/language/en-GB/en-GB.plg_vmshipment_rules_shipping.ini b/language/en-GB/en-GB.plg_vmshipment_rules_shipping.ini
index ae6f35a..debc92e 100644
--- a/language/en-GB/en-GB.plg_vmshipment_rules_shipping.ini
+++ b/language/en-GB/en-GB.plg_vmshipment_rules_shipping.ini
@@ -16,6 +16,14 @@ VMSHIPMENT_RULES_HELP_ADV="<div style='background: #DDDDDD; padding:5px; margin:
 VMSHIPMENT_RULES_LENGTH_UNIT="Length Unit"
 VMSHIPMENT_RULES_LENGTH_UNIT_DESC="The length unit, in which the length, width and heights are given, and from which the volume is calculated."
 
+VMSHIPMENT_RULES_OFFER="Offer matching rules"
+VMSHIPMENT_RULES_OFFER_DESC="Select whether to offer only the first matching rule of this method, all matching rules, or zone-based."
+VMSHIPMENT_RULES_OFFER_FIRST="Offer only the first matching rule"
+VMSHIPMENT_RULES_OFFER_FIRST_ZONE_ALL="Offer all matching rules of the zone with the first match"
+VMSHIPMENT_RULES_OFFER_FIRST_EACH_ZONE="Offer the first matching rule of each zone"
+VMSHIPMENT_RULES_OFFER_ALL="Offer all matching rules"
+
+
 VMSHIPMENT_RULES_COUNTRIES1_LABEL="<b>Rules for country set 1</b>"
 VMSHIPMENT_RULES_COUNTRIES2_LABEL="<b>Rules for country set 2</b>"
 VMSHIPMENT_RULES_COUNTRIES3_LABEL="<b>Rules for country set 3</b>"
diff --git a/rules_shipping.xml b/rules_shipping.xml
index 5625315..34e6ff0 100644
--- a/rules_shipping.xml
+++ b/rules_shipping.xml
@@ -36,6 +36,7 @@
              	stripext="0"   exclude="^_" />
 	<param name="weight_unit" type="vmweightunit" size="10" default="" label="VMSHIPMENT_WEIGHT_COUNTRIES_WEIGHT_UNIT" description="VMSHIPMENT_WEIGHT_COUNTRIES_WEIGHT_UNIT_DESC"/>
 	<param name="length_unit" type="vmlengthunit" size="10" default="" label="VMSHIPMENT_RULES_LENGTH_UNIT" description="VMSHIPMENT_RULES_LENGTH_UNIT_DESC"/>
+	<param name="offer_rules" type="hidden" default="0" label="VMSHIPMENT_RULES_OFFER" description="VMSHIPMENT_RULES_OFFER_DESC" />
 
 	<param type="rklabel" default='VMSHIPMENT_RULES_HELP' />
 
diff --git a/rules_shipping_advanced.xml b/rules_shipping_advanced.xml
index ca9a10d..820a234 100644
--- a/rules_shipping_advanced.xml
+++ b/rules_shipping_advanced.xml
@@ -35,6 +35,12 @@
              	stripext="0"   exclude="^_" />
 	<param name="weight_unit" type="vmweightunit" size="10" default="" label="VMSHIPMENT_WEIGHT_COUNTRIES_WEIGHT_UNIT" description="VMSHIPMENT_WEIGHT_COUNTRIES_WEIGHT_UNIT_DESC"/>
 	<param name="length_unit" type="vmlengthunit" size="10" default="" label="VMSHIPMENT_RULES_LENGTH_UNIT" description="VMSHIPMENT_RULES_LENGTH_UNIT_DESC"/>
+        <param name="offer_rules" type="list" default="0" label="VMSHIPMENT_RULES_OFFER" description="VMSHIPMENT_RULES_OFFER_DESC" >
+            <option value="0">VMSHIPMENT_RULES_OFFER_FIRST</option>
+            <option value="1">VMSHIPMENT_RULES_OFFER_FIRST_ZONE_ALL</option>
+            <option value="2">VMSHIPMENT_RULES_OFFER_FIRST_EACH_ZONE</option>
+            <option value="3">VMSHIPMENT_RULES_OFFER_ALL</option>
+        </param>
 
 	<param type="rklabel" default='VMSHIPMENT_RULES_HELP_ADV' />
 
diff --git a/rules_shipping_base.php b/rules_shipping_base.php
index 39c3ef7..8f17611 100644
--- a/rules_shipping_base.php
+++ b/rules_shipping_base.php
@@ -290,25 +290,25 @@ class plgVmShipmentRules_Shipping_Base extends vmPSPlugin {
 		return new ShippingRule($r, $countries, $tax);
 	}
 
-	private function parseMethodRule ($rulestring, $countries, $tax, &$method) {
+	private function parseMethodRule ($nr, $rulestring, $countries, $tax, &$method) {
 		$rules1 = preg_split("/(\r\n|\n|\r)/", $rulestring);
 		foreach ($rules1 as $r) {
 			// Ignore empty lines
 			if (empty($r)) continue;
-			$method->rules[] = $this->createMethodRule ($r, $countries, $tax);
+			$method->rules[$nr][] = $this->createMethodRule ($r, $countries, $tax);
 		}
 	}
 	
 	protected function parseMethodRules (&$method) {
 		if (!isset($method->rules)) $method->rules = array();
-		$this->parseMethodRule ($method->rules1, $method->countries1, $method->tax_id1, $method);
-		$this->parseMethodRule ($method->rules2, $method->countries2, $method->tax_id2, $method);
-		$this->parseMethodRule ($method->rules3, $method->countries3, $method->tax_id3, $method);
-		$this->parseMethodRule ($method->rules4, $method->countries4, $method->tax_id4, $method);
-		$this->parseMethodRule ($method->rules5, $method->countries5, $method->tax_id5, $method);
-		$this->parseMethodRule ($method->rules6, $method->countries6, $method->tax_id6, $method);
-		$this->parseMethodRule ($method->rules7, $method->countries7, $method->tax_id7, $method);
-		$this->parseMethodRule ($method->rules8, $method->countries8, $method->tax_id8, $method);
+		$this->parseMethodRule (1, $method->rules1, $method->countries1, $method->tax_id1, $method);
+		$this->parseMethodRule (2, $method->rules2, $method->countries2, $method->tax_id2, $method);
+		$this->parseMethodRule (3, $method->rules3, $method->countries3, $method->tax_id3, $method);
+		$this->parseMethodRule (4, $method->rules4, $method->countries4, $method->tax_id4, $method);
+		$this->parseMethodRule (5, $method->rules5, $method->countries5, $method->tax_id5, $method);
+		$this->parseMethodRule (6, $method->rules6, $method->countries6, $method->tax_id6, $method);
+		$this->parseMethodRule (7, $method->rules7, $method->countries7, $method->tax_id7, $method);
+		$this->parseMethodRule (8, $method->rules8, $method->countries8, $method->tax_id8, $method);
 	}
 
 	protected function getOrderArticles (VirtueMartCart $cart) {
@@ -427,16 +427,26 @@ class plgVmShipmentRules_Shipping_Base extends vmPSPlugin {
 	protected function checkConditions ($cart, $method, $cart_prices) {
 		if (!isset($method->rules)) $this->parseMethodRules($method);
 
+		// $method->offer_rules has the following possible values:
+		//  0 ... Offer only the first matching rule (default)
+		//  1 ... Offer all matching rules of the first zone with a match
+		//  2 ... Offer the first matching rule of each zone
+		//  3 ... Offer all matching rules from all zones
 		$cartvals = $this->getCartValues ($cart, $method, $cart_prices);
-		foreach ($method->rules as $r) {
-			if ($r->matches($cartvals)) {
-				$method->matched_rule = $r;
-				$method->rule_name = $r->name;
-				return TRUE;
+		$nr = 0;
+		foreach ($method->rules as $zone) {
+			foreach ($zone as $r) {
+				if ($r->matches($cartvals)) {
+					$method->matched_rule = $r;
+					$method->rule_name = $r->name;
+					$nr++;
+				}
 			}
 		}
-		vmdebug('checkConditions '.$method->name.' does not fit');
-		return FALSE;
+		if ($nr==0) {
+			vmdebug('checkConditions '.$method->name.' does not fit');
+		}
+		return $nr;
 	}
 
 	/**
@@ -542,14 +552,14 @@ class plgVmShipmentRules_Shipping_Base extends vmPSPlugin {
 		if (isset($data['rules1'])) {
 			// Try to parse all rules (and spit out error) to inform the user:
 			$method = new StdClass ();
-			$this->parseMethodRule ($data['rules1'], isset($data['countries1'])?$data['countries1']:array(), $data['tax_id1'], $method);
-			$this->parseMethodRule ($data['rules2'], isset($data['countries2'])?$data['countries2']:array(), $data['tax_id2'], $method);
-			$this->parseMethodRule ($data['rules3'], isset($data['countries3'])?$data['countries3']:array(), $data['tax_id3'], $method);
-			$this->parseMethodRule ($data['rules4'], isset($data['countries4'])?$data['countries4']:array(), $data['tax_id4'], $method);
-			$this->parseMethodRule ($data['rules5'], isset($data['countries5'])?$data['countries5']:array(), $data['tax_id5'], $method);
-			$this->parseMethodRule ($data['rules6'], isset($data['countries6'])?$data['countries6']:array(), $data['tax_id6'], $method);
-			$this->parseMethodRule ($data['rules7'], isset($data['countries7'])?$data['countries7']:array(), $data['tax_id7'], $method);
-			$this->parseMethodRule ($data['rules8'], isset($data['countries8'])?$data['countries8']:array(), $data['tax_id8'], $method);
+			$this->parseMethodRule (1, $data['rules1'], isset($data['countries1'])?$data['countries1']:array(), $data['tax_id1'], $method);
+			$this->parseMethodRule (2, $data['rules2'], isset($data['countries2'])?$data['countries2']:array(), $data['tax_id2'], $method);
+			$this->parseMethodRule (3, $data['rules3'], isset($data['countries3'])?$data['countries3']:array(), $data['tax_id3'], $method);
+			$this->parseMethodRule (4, $data['rules4'], isset($data['countries4'])?$data['countries4']:array(), $data['tax_id4'], $method);
+			$this->parseMethodRule (5, $data['rules5'], isset($data['countries5'])?$data['countries5']:array(), $data['tax_id5'], $method);
+			$this->parseMethodRule (6, $data['rules6'], isset($data['countries6'])?$data['countries6']:array(), $data['tax_id6'], $method);
+			$this->parseMethodRule (7, $data['rules7'], isset($data['countries7'])?$data['countries7']:array(), $data['tax_id7'], $method);
+			$this->parseMethodRule (8, $data['rules8'], isset($data['countries8'])?$data['countries8']:array(), $data['tax_id8'], $method);
 		}
 		$ret=$this->setOnTablePluginParams ($name, $id, $table);
 		return $ret;
-- 
GitLab