From f464bd935394268269b27473a2797024023d120d Mon Sep 17 00:00:00 2001
From: Reinhold Kainhofer <reinhold@kainhofer.com>
Date: Sun, 28 Dec 2014 02:38:04 +0100
Subject: [PATCH] Changed scope identifier to the form website/store/view

---
 .../OpenTools/Ordernumber/Block/Counters.php  | 29 ++++++-----
 .../Ordernumber/Model/Backend/Counters.php    | 48 +++++--------------
 .../OpenTools/Ordernumber/Model/Observer.php  |  9 ++--
 .../Ordernumber/Model/Ordernumber.php         | 12 ++---
 .../Model/Resource/Ordernumber.php            | 10 ++--
 .../install-0.1.0.php                         |  8 ++--
 6 files changed, 45 insertions(+), 71 deletions(-)

diff --git a/app/code/community/OpenTools/Ordernumber/Block/Counters.php b/app/code/community/OpenTools/Ordernumber/Block/Counters.php
index c5b6b86..750fca7 100644
--- a/app/code/community/OpenTools/Ordernumber/Block/Counters.php
+++ b/app/code/community/OpenTools/Ordernumber/Block/Counters.php
@@ -137,7 +137,7 @@ class OpenTools_Ordernumber_Block_Counters extends Mage_Adminhtml_Block_System_C
 	    $websites = $sstore->getWebsiteCollection();
 	    foreach ($websites as $website) {
 	        $websiteId = $website->getId();
-	        $siteStr = 'w'.(int)$websiteId;
+	        $siteStr = (int)$websiteId;
 	        if ($websiteIds && !in_array($websiteId, $websiteIds)) {
 	            continue;
 	        }
@@ -153,7 +153,7 @@ class OpenTools_Ordernumber_Block_Counters extends Mage_Adminhtml_Block_System_C
 
 	        foreach ($website->getGroups() as $group) {
 	            $groupId = $group->getId();
-	            $groupStr = $siteStr . 'g' . (int)$groupId;
+	            $groupStr = $siteStr . '/' . (int)$groupId;
 
 	            if ($groupIds && !in_array($groupId, $groupIds)) {
 	                continue;
@@ -168,7 +168,7 @@ class OpenTools_Ordernumber_Block_Counters extends Mage_Adminhtml_Block_System_C
 	            foreach ($group->getStores() as $store) {
 
 	                $storeId = $store->getId();
-	                $storeStr = $groupStr . 's' . (int)$storeId;
+	                $storeStr = $groupStr . '/' . (int)$storeId;
 	                if ($storeIds && !in_array($storeId, $storeIds)) {
 	                    continue;
 	                }
@@ -201,26 +201,33 @@ class OpenTools_Ordernumber_Block_Counters extends Mage_Adminhtml_Block_System_C
 	    return $html;
 	}
 
-	protected function _convertScopeToString($website_id, $group_id, $store_id)
+	/** Convert the scope id ('' for global, websiteID/groupID/storeID)
+	 *  to a human-readable string
+	 *
+	 * @param $scope_ids scope id ('' for global, websiteID/groupID/storeID)
+	 * @return string
+	 */
+	protected function _convertScopeToString($scope_ids)
 	{
 	    $sstore = Mage::getSingleton('adminhtml/system_store');
 		$nonEscapableNbspChar = html_entity_decode('&#160;', ENT_NOQUOTES, 'UTF-8');
+		$ids = explode ('/', $scope_ids);
 
 	    $scopes = array();
-	    if ($website_id<=0) {
+	    if (empty($ids) || empty($ids[0])) {
 	        $scopes[] = $this->__('Global');
 	    } else {
-	        $website = Mage::getModel('core/website')->load($website_id);
+	        $website = Mage::getModel('core/website')->load($ids[0]);
 	        if ($website)
     	        $scopes[] = $this->__('Website: %s', $website->getName());
 	    }
-	    if ($group_id>0) {
-	        $group = Mage::getModel('core/store_group')->load($group_id);
+	    if (count($ids)>1) {
+	        $group = Mage::getModel('core/store_group')->load($ids[1]);
 	        if ($group)
     	        $scopes[] = str_repeat($nonEscapableNbspChar, 4) . $this->__('Store: %s', $group->getName());
 	    }
-	    if ($store_id>0) {
-	        $store = Mage::getModel('core/store')->load($store_id);
+	    if (count($ids)>2) {
+	        $store = Mage::getModel('core/store')->load($ids[2]);
 	        if ($store)
     	        $scopes[] = str_repeat($nonEscapableNbspChar, 8) . $this->__('View: %s', $store->getName());
 	    }
@@ -241,7 +248,7 @@ class OpenTools_Ordernumber_Block_Counters extends Mage_Adminhtml_Block_System_C
 		$class = ($class=='odd')?'even':'odd';
 		$types = $this->getNumberTypes();
 		$html .= '<td class="ordernumber_type">'.$types[$counter->getNumberType()].'</td>';
-		$html .= '<td class="ordernumber_scope">' . $this->_convertScopeToString($counter->getWebsiteId(), $counter->getGroupId(), $counter->getStoreId()) . '</td>';
+		$html .= '<td class="ordernumber_scope">' . $this->_convertScopeToString($counter->getNumberScope()) . '</td>';
 		$html .= '<td class="ordernumber_name">' . $counter->getNumberFormat() . '</td>';
 		$html .= '<td class="ordernumber_counter">' .
 		           '<div class="">' . (int)$counter->getCount() . '</div>' .
diff --git a/app/code/community/OpenTools/Ordernumber/Model/Backend/Counters.php b/app/code/community/OpenTools/Ordernumber/Model/Backend/Counters.php
index b1a417f..67c8187 100644
--- a/app/code/community/OpenTools/Ordernumber/Model/Backend/Counters.php
+++ b/app/code/community/OpenTools/Ordernumber/Model/Backend/Counters.php
@@ -30,13 +30,13 @@ class OpenTools_Ordernumber_Model_Backend_Counters extends Mage_Core_Model_Confi
                 if ($oldval != $newval) {
                     $counter = $model->load($countid);
                     if ($counter->getCount() != $oldval) {
-                        $session->addWarning($helper->__('Counter "%s" (type: %s) was changed in the background in the dabase from %d to %d. Overwriting with %d.',
-                                $counter->getNumberFormat(), $model->readableType($counter->getNumberType()), $oldval, $counter->getCount(), $newval));
+                        $session->addWarning($helper->__('Counter "%s" (type: %s, scope: %s) was changed in the background in the dabase from %d to %d. Overwriting with %d.',
+                                $counter->getNumberFormat(), $model->readableType($counter->getNumberType()), $counter->getNumberScope(), $oldval, $counter->getCount(), $newval));
                     }
                     $counter->setCount($newval)
                             ->save();
-                    $session->addSuccess($helper->__('Successfully changed counter "%s" (type: %s) from %d to %d',
-                            $counter->getNumberFormat(), $model->reNadableType($counter->getNumberType()), $oldval, $counter->getCount()));
+                    $session->addSuccess($helper->__('Successfully changed counter "%s" (type: %s, scope: %s) from %d to %d',
+                            $counter->getNumberFormat(), $model->reNadableType($counter->getNumberType()), $counter->getNumberScope(), $oldval, $counter->getCount()));
                 }
             }
             // Deleting counters:
@@ -45,51 +45,25 @@ class OpenTools_Ordernumber_Model_Backend_Counters extends Mage_Core_Model_Confi
                 // Check if the counter has changed meanwhile in the DB!
                 $counter = $model->load($countid);
                 if ($counter->getCount() != $oldval) {
-                    $session->addWarning($helper->__('Counter "%s" (type: %s) was changed in the background in the dabase from %d to %d. Deleting it nonetheless.',
-                            $counter->getNumberFormat(), $model->readableType($counter->getNumberType()), $oldval, $counter->getCount()));
+                    $session->addWarning($helper->__('Counter "%s" (type: %s, scope: %s) was changed in the background in the dabase from %d to %d. Deleting it nonetheless.',
+                            $counter->getNumberFormat(), $model->readableType($counter->getNumberType()), $counter->getNumberScope(), $oldval, $counter->getCount()));
                 }
                 $counter->delete();
-                $session->addSuccess($helper->__('Successfully deleted counter "%s" (type: %s) with value %d',
-                          $counter->getNumberFormat(), $model->readableType($counter->getNumberType()), $counter->getCount()));
+                $session->addSuccess($helper->__('Successfully deleted counter "%s" (type: %s, scope: %s) with value %d',
+                          $counter->getNumberFormat(), $model->readableType($counter->getNumberType()), $counter->getNumberScope(), $counter->getCount()));
             }
             // New counters
             foreach ($vals['new_counter_type'] as $nr =>$countertype) {
                 // TODO: Check whether a counter with these name, scope and type already exists!
                 $scope = $vals['new_counter_scope'][$nr];
-                // Extract the counter scope from the request variable
-                $website = 0;
-                $group = 0;
-                $store = 0;
-                // Loop through the characters and process groups w[0-9]+, g[0-9]+, s[0-9]+
-                $i = 0;
-                $len = strlen($scope);
-                while ($i<$len) {
-                    $ch = $scope[$i];
-                    $i++;
-                    if ($i>=$len || !in_array($ch, array('w', 'g', 's')))
-                        continue;
-                    $nr = 0;
-                    while ($i<$len && ctype_digit($scope[$i])) {
-                        $nr = $nr*10 + (int)$scope[$i];
-                        $i++;
-                    }
-                    switch ($ch) {
-                        case 'w': $website = $nr; break;
-                        case 'g': $group = $nr; break;
-                        case 's': $store = $nr; break;
-                    }
-                }
-
                 $counter = $model->unsetData()
                                  ->setNumberType($countertype)
-                                 ->setWebsiteId($website)
-                                 ->setGroupId($group)
-                                 ->setStoreId($store)
+                                 ->setNumberScope($vals['new_counter_scope'][$nr])
                                  ->setNumberFormat($vals['new_counter_name'][$nr])
                                  ->setCount($vals['new_counter_value'][$nr])
                                  ->save();
-                $session->addSuccess($helper->__('Successfully created counter "%s" (type: %s) with value %d',
-                          $counter->getNumberFormat(), $model->readableType($counter->getNumberType()), $counter->getCount()));
+                $session->addSuccess($helper->__('Successfully created counter "%s" (type: %s, scope: %s) with value %d',
+                          $counter->getNumberFormat(), $model->readableType($counter->getNumberType()), $counter->getNumberScope(), $counter->getCount()));
             }
         }
     }
diff --git a/app/code/community/OpenTools/Ordernumber/Model/Observer.php b/app/code/community/OpenTools/Ordernumber/Model/Observer.php
index 69bdb58..0c97c8d 100644
--- a/app/code/community/OpenTools/Ordernumber/Model/Observer.php
+++ b/app/code/community/OpenTools/Ordernumber/Model/Observer.php
@@ -126,10 +126,11 @@ Mage::Log('customvars: '.print_r($customvars,1), null, 'ordernumber.log');
                 $count += 1;
 
                 // Find the next counter value
-                $website_id = ($scope>=1)?$store->getWebsiteId():0;
-                $group_id = ($scope>=2)?$store->getGroupId():0;
-                $store_id = ($scope>=3)?$store->getStoreId():0;
-                $count = $model->getCounterValueIncremented($nrtype, $counterfmt, $increment, $website_id, $group_id, $store_id);
+                $scope_id = '';
+                if ($scope>=1) $scope_id = $store->getWebsiteId();
+                if ($scope>=2) $scope_id .= '/' . $store->getGroupId();
+                if ($scope>=3) $scope_id .= '/' . $store->getStoreId();
+                $count = $model->getCounterValueIncremented($nrtype, $counterfmt, $increment, $scope_id);
                 $newnumber = str_replace ("#", sprintf('%0' . (int)$digits . 's', $count), $format);
 
                 // Check whether that number is already in use. If so, attempt to create the next number:
diff --git a/app/code/community/OpenTools/Ordernumber/Model/Ordernumber.php b/app/code/community/OpenTools/Ordernumber/Model/Ordernumber.php
index 4331a25..1ed04ab 100644
--- a/app/code/community/OpenTools/Ordernumber/Model/Ordernumber.php
+++ b/app/code/community/OpenTools/Ordernumber/Model/Ordernumber.php
@@ -8,13 +8,11 @@ class OpenTools_Ordernumber_Model_Ordernumber extends Mage_Core_Model_Abstract
          parent::_construct();
          $this->_init('opentools_ordernumber/ordernumber');
      }
-     public function getCounterValueIncremented($nrtype, $format, $increment=1, $website_id=0, $group_id=0, $store_id=0) {
+     public function getCounterValueIncremented($nrtype, $format, $increment=1, $scope_id='') {
         $helper = Mage::helper('ordernumber');
-        $this->loadNumberCounter($nrtype, $format, $website_id, $group_id, $store_id);
+        $this->loadNumberCounter($nrtype, $format, $scope_id);
 
-        $this->setWebsiteId($website_id);
-        $this->setGroupId($group_id);
-        $this->setStoreId($store_id);
+        $this->setNumberScope($scope_id);
         $this->setNumberType($nrtype);
         $this->setNumberFormat($format);
         $count = $this->getCount() + $increment;
@@ -22,9 +20,9 @@ class OpenTools_Ordernumber_Model_Ordernumber extends Mage_Core_Model_Abstract
         $res = $this->save();
         return $count;
      }
-    public function loadNumberCounter($nrtype, $format, $website_id, $group_id, $store_id)
+    public function loadNumberCounter($nrtype, $format, $scope_id='')
     {
-        $this->_getResource()->loadNumberCounter($this, $nrtype, $format, $website_id, $group_id, $store_id);
+        $this->_getResource()->loadNumberCounter($this, $nrtype, $format, $scope_id);
         $this->_afterLoad();
         $this->setOrigData();
         $this->_hasDataChanges = false;
diff --git a/app/code/community/OpenTools/Ordernumber/Model/Resource/Ordernumber.php b/app/code/community/OpenTools/Ordernumber/Model/Resource/Ordernumber.php
index d78c85d..1c5b177 100644
--- a/app/code/community/OpenTools/Ordernumber/Model/Resource/Ordernumber.php
+++ b/app/code/community/OpenTools/Ordernumber/Model/Resource/Ordernumber.php
@@ -5,22 +5,18 @@ class OpenTools_Ordernumber_Model_Resource_Ordernumber extends Mage_Core_Model_R
          $this->_init('opentools_ordernumber/ordernumber', 'ordernumber_id');
      }
 
-    public function loadNumberCounter(Mage_Core_Model_Abstract $object, $nrtype, $format, $website_id, $group_id, $store_id) {
+    public function loadNumberCounter(Mage_Core_Model_Abstract $object, $nrtype, $format, $scope='') {
         $read = $this->_getWriteAdapter();
         if ($read && !is_null($nrtype)) {
             $typefield = $read->quoteIdentifier(sprintf('%s.%s', $this->getMainTable(), 'number_type'));
             $formatfield = $read->quoteIdentifier(sprintf('%s.%s', $this->getMainTable(), 'number_format'));
-            $websitefield = $read->quoteIdentifier(sprintf('%s.%s', $this->getMainTable(), 'website_id'));
-            $groupfield = $read->quoteIdentifier(sprintf('%s.%s', $this->getMainTable(), 'group_id'));
-            $storefield = $read->quoteIdentifier(sprintf('%s.%s', $this->getMainTable(), 'store_id'));
+            $scopefield = $read->quoteIdentifier(sprintf('%s.%s', $this->getMainTable(), 'number_scope'));
 
             $select = $read->select()
                 ->from($this->getMainTable())
                 ->where($typefield . '=?', $nrtype)
                 ->where($formatfield .'=?', $format)
-                ->where($websitefield . '=?', $website_id)
-                ->where($groupfield . '=?', $group_id)
-                ->where($storefield . '=?', $store_id);
+                ->where($scopefield . '=?', $scope);
             $data = $read->fetchRow($select);
             if ($data) {
                 $object->setData($data);
diff --git a/app/code/community/OpenTools/Ordernumber/sql/opentools_ordernumber_setup/install-0.1.0.php b/app/code/community/OpenTools/Ordernumber/sql/opentools_ordernumber_setup/install-0.1.0.php
index 570c707..7d9ea96 100644
--- a/app/code/community/OpenTools/Ordernumber/sql/opentools_ordernumber_setup/install-0.1.0.php
+++ b/app/code/community/OpenTools/Ordernumber/sql/opentools_ordernumber_setup/install-0.1.0.php
@@ -19,17 +19,15 @@ $table = $installer->getConnection()
         'primary'  => true,
     ), 'Ordernumber id')
     ->addColumn('number_type',  Varien_Db_Ddl_Table::TYPE_TEXT,      63, array('nullable'=> false),                 'Number Type')
-    ->addColumn('website_id',   Varien_Db_Ddl_Table::TYPE_SMALLINT,null, array('nullable'=> false, 'default'=>-1),  'Website ID')
-    ->addColumn('group_id',     Varien_Db_Ddl_Table::TYPE_SMALLINT,null, array('nullable'=> false, 'default'=>-1),  'Group ID')
-    ->addColumn('store_id',     Varien_Db_Ddl_Table::TYPE_SMALLINT,null, array('nullable'=> false, 'default'=>-1),  'Store ID')
+    ->addColumn('number_scope', Varien_Db_Ddl_Table::TYPE_TEXT,      20, array('nullable'=> false, 'default'=>''),  'Number Scope')
     ->addColumn('number_format',Varien_Db_Ddl_Table::TYPE_TEXT,     255, array('nullable'=> true),                  'Number Format')
     ->addColumn('count',        Varien_Db_Ddl_Table::TYPE_INTEGER, null, array('unsigned'=>true,'nullable'=>false), 'Counter')
     ->addIndex($installer->getIdxName(
             $installer->getTable('opentools_ordernumber/ordernumber'),
-            array('number_type', 'website_id', 'group_id', 'store_id', 'number_format'),
+            array('number_type', 'number_scope', 'number_format'),
             Varien_Db_Adapter_Interface::INDEX_TYPE_UNIQUE
         ),
-        array('number_type', 'number_format'),
+        array('number_type', 'number_scope', 'number_format'),
         array('type' => Varien_Db_Adapter_Interface::INDEX_TYPE_UNIQUE)
     )
     ->setComment('Ordernumber Counter Table');
-- 
GitLab