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