Your IP : 216.73.216.63


Current Path : /home/alh/vendors/excelport/
Upload File :
Current File : //home/alh/vendors/excelport/excelport_openstock.xml

<?xml version="1.0" encoding="utf-8"?>
<modification>
  <id>ExcelPort OpenStock</id>
  <version>2.5.6</version>
  <vqmver>2.x</vqmver>
  <author>iSenseLabs Team | http://isenselabs.com</author>
  
  <file name="admin/model/extension/module/excelport.php">
  <operation error="log">
    <search position="after"><![CDATA[/* {EXTRA_PRODUCT_FIELDS} */]]></search>   
            <add><![CDATA[
      array(
        'title' => 'Has Options',
        'column_full' => 'S',
        'column_light' => 'AO',
        'column_bulk' => array(
          'product' => 'AO'
        ),
        'name' => 'custom_has_options',
        'select_sql' => "SELECT DISTINCT product_id, has_option as value FROM {DB_PREFIX}product",
        'select_eval' => NULL,
        'eval_add' => '',
        'eval_edit' => ''
      )
      ]]></add>
        </operation>
    <operation>
      <search position="replace"><![CDATA[public $productSize = 26;]]></search>
      <add><![CDATA[public $productSize = 33;]]></add>
    </operation>
    <operation>
      <search position="after"><![CDATA["reward points",]]></search>
      <add><![CDATA[
        "option stock",
        "Option Stock",
      ]]></add>
    </operation>
  </file>
  
  <file name="admin/model/extension/module/excelport_product.php">
    <operation>
      <search position="after"><![CDATA[class ModelExtensionModuleExcelportproduct extends ModelExtensionModuleExcelport {]]></search>
      <add><![CDATA[
        public function getCustomerGroupName($customer_group_id) {
            if (version_compare(VERSION, '2.1.0.1', '>=')) {
                $this->load->model('customer/customer_group');
                $cg = $this->model_customer_customer_group->getCustomerGroup($customer_group_id);
            } else {
                $this->load->model('sale/customer_group');
                $cg = $this->model_sale_customer_group->getCustomerGroup($customer_group_id);
            }
            
            return !empty($cg['name']) ? $cg['name'] : '';
        }

        public function getCustomerGroupId($customer_group_name) {
            $cg_id_query = $this->db->query("SELECT customer_group_id FROM " . DB_PREFIX . "customer_group_description WHERE name='" . $this->db->escape($customer_group_name) . "'");

            return !empty($cg_id_query->row['customer_group_id']) ? (int)$cg_id_query->row['customer_group_id'] : 0;
        }
      ]]></add>
    </operation>
    <operation>
      <search position="after"><![CDATA[$merges = array]]></search>
      <add><![CDATA[
      $merges[] = 2;
      $merges[] = 26;
      $merges[] = 2;
      $merges[] = 32;
      ]]></add>
    </operation>
    <operation>
      <search position="before"><![CDATA[$leftColumnStaticText = array]]></search>
      <add><![CDATA[$dynamicTemplates['open_stock'] = array(4,26,4,32);]]></add>
    </operation>
    <operation>
      <search position="after"><![CDATA[$leftColumnStaticTextColumn4 = array]]></search>
      <add><![CDATA[
      $leftColumnStaticTextColumn1[] = null;
      $leftColumnStaticTextColumn1[] = null;
      $leftColumnStaticTextColumn1[] = null;
      $leftColumnStaticTextColumn1[] = null;
      $leftColumnStaticTextColumn1[] = null;
      $leftColumnStaticTextColumn1[] = null;
      $leftColumnStaticTextColumn1[] = null;
      $leftColumnStaticTextColumn2[] = null;
      $leftColumnStaticTextColumn2[] = null;
      $leftColumnStaticTextColumn2[] = null;
      $leftColumnStaticTextColumn2[] = null;
      $leftColumnStaticTextColumn2[] = null;
      $leftColumnStaticTextColumn2[] = null;
      $leftColumnStaticTextColumn2[] = null;
      $leftColumnStaticTextColumn3[] = 'Open Stock';
      $leftColumnStaticTextColumn3[] = null;
      $leftColumnStaticTextColumn3[] = null;
      $leftColumnStaticTextColumn3[] = null;
      $leftColumnStaticTextColumn3[] = null;
      $leftColumnStaticTextColumn3[] = null;
      $leftColumnStaticTextColumn3[] = null;
      $leftColumnStaticTextColumn4[] = 'Combination/Type';
      $leftColumnStaticTextColumn4[] = 'SKU/Group';
      $leftColumnStaticTextColumn4[] = 'Weight/Date Start';
      $leftColumnStaticTextColumn4[] = 'Stock/Date End';
      $leftColumnStaticTextColumn4[] = 'Price';
      $leftColumnStaticTextColumn4[] = 'Status/Quantity';
      $leftColumnStaticTextColumn4[] = 'Image';
      ]]></add>
    </operation>
    <operation>
      <search position="before"><![CDATA[if (!empty($designLayoutRange[1])) {]]></search>
      <add><![CDATA[
      
      // Open Stock
      $this->load->model('tool/image');
      $this->load->model('extension/module/openstock');
      
      $productOpenStocks = $this->model_extension_module_openstock->getVariants($row['product_id']);
      
      $i3 = $dynamicTemplates['open_stock'][0];
      
      foreach ($productOpenStocks as $productOpenStock) {
        
        $var = $productOpenStock['variant_values'];
        $resulting_var = array();
        foreach ($var as $item) {
          if (isset($productOpenStock['option_values'][$item['product_option_value_id']]) && trim($productOpenStock['option_values'][$item['product_option_value_id']]) !== '') {
            $resulting_var[] = $productOpenStock['option_values'][$item['product_option_value_id']];
          }
        }
        
        if (!empty($resulting_var)) {       
          $productSheetObj->setCellValueExplicit(PHPExcel_Cell::stringFromColumnIndex($target[0] + $i3) . ($target[1] + $dynamicTemplates['open_stock'][1] + 0), implode('|', $resulting_var), PHPExcel_Cell_DataType::TYPE_STRING);
          
          $productSheetObj->setCellValueExplicit(PHPExcel_Cell::stringFromColumnIndex($target[0] + $i3) . ($target[1] + $dynamicTemplates['open_stock'][1] + 1), $productOpenStock['sku'], PHPExcel_Cell_DataType::TYPE_STRING);
          
          $productSheetObj->setCellValueExplicit(PHPExcel_Cell::stringFromColumnIndex($target[0] + $i3) . ($target[1] + $dynamicTemplates['open_stock'][1] + 2), $productOpenStock['weight'], PHPExcel_Cell_DataType::TYPE_STRING);
          
          $productSheetObj->setCellValueExplicit(PHPExcel_Cell::stringFromColumnIndex($target[0] + $i3) . ($target[1] + $dynamicTemplates['open_stock'][1] + 3), $productOpenStock['stock'], PHPExcel_Cell_DataType::TYPE_STRING);
          
          $productSheetObj->setCellValueExplicit(PHPExcel_Cell::stringFromColumnIndex($target[0] + $i3) . ($target[1] + $dynamicTemplates['open_stock'][1] + 4), $productOpenStock['price'], PHPExcel_Cell_DataType::TYPE_STRING);
          
          $productSheetObj->setCellValueExplicit(PHPExcel_Cell::stringFromColumnIndex($target[0] + $i3) . ($target[1] + $dynamicTemplates['open_stock'][1] + 5), !empty($productOpenStock['active']) ? 'Enabled' : 'Disabled', PHPExcel_Cell_DataType::TYPE_STRING);
          
          $productSheetObj->setCellValueExplicit(PHPExcel_Cell::stringFromColumnIndex($target[0] + $i3) . ($target[1] + $dynamicTemplates['open_stock'][1] + 6), $productOpenStock['image'], PHPExcel_Cell_DataType::TYPE_STRING);

          $i3++;

          foreach ($productOpenStock['specials'] as $special) {

            $productSheetObj->setCellValueExplicit(PHPExcel_Cell::stringFromColumnIndex($target[0] + $i3) . ($target[1] + $dynamicTemplates['open_stock'][1] + 0), ':special:', PHPExcel_Cell_DataType::TYPE_STRING);
            
            $productSheetObj->setCellValueExplicit(PHPExcel_Cell::stringFromColumnIndex($target[0] + $i3) . ($target[1] + $dynamicTemplates['open_stock'][1] + 1), $this->getCustomerGroupName($special['customer_group_id']), PHPExcel_Cell_DataType::TYPE_STRING);
            
            $productSheetObj->setCellValueExplicit(PHPExcel_Cell::stringFromColumnIndex($target[0] + $i3) . ($target[1] + $dynamicTemplates['open_stock'][1] + 2), $special['date_start'], PHPExcel_Cell_DataType::TYPE_STRING);
            
            $productSheetObj->setCellValueExplicit(PHPExcel_Cell::stringFromColumnIndex($target[0] + $i3) . ($target[1] + $dynamicTemplates['open_stock'][1] + 3), $special['date_end'], PHPExcel_Cell_DataType::TYPE_STRING);
            
            $productSheetObj->setCellValueExplicit(PHPExcel_Cell::stringFromColumnIndex($target[0] + $i3) . ($target[1] + $dynamicTemplates['open_stock'][1] + 4), $special['price'], PHPExcel_Cell_DataType::TYPE_STRING);
            
            $i3++;
          }

          foreach ($productOpenStock['discounts'] as $discount) {

            $productSheetObj->setCellValueExplicit(PHPExcel_Cell::stringFromColumnIndex($target[0] + $i3) . ($target[1] + $dynamicTemplates['open_stock'][1] + 0), ':discount:', PHPExcel_Cell_DataType::TYPE_STRING);
            
            $productSheetObj->setCellValueExplicit(PHPExcel_Cell::stringFromColumnIndex($target[0] + $i3) . ($target[1] + $dynamicTemplates['open_stock'][1] + 1), $this->getCustomerGroupName($discount['customer_group_id']), PHPExcel_Cell_DataType::TYPE_STRING);
            
            $productSheetObj->setCellValueExplicit(PHPExcel_Cell::stringFromColumnIndex($target[0] + $i3) . ($target[1] + $dynamicTemplates['open_stock'][1] + 2), $discount['date_start'], PHPExcel_Cell_DataType::TYPE_STRING);
            
            $productSheetObj->setCellValueExplicit(PHPExcel_Cell::stringFromColumnIndex($target[0] + $i3) . ($target[1] + $dynamicTemplates['open_stock'][1] + 3), $discount['date_end'], PHPExcel_Cell_DataType::TYPE_STRING);
            
            $productSheetObj->setCellValueExplicit(PHPExcel_Cell::stringFromColumnIndex($target[0] + $i3) . ($target[1] + $dynamicTemplates['open_stock'][1] + 4), $discount['price'], PHPExcel_Cell_DataType::TYPE_STRING);

            $productSheetObj->setCellValueExplicit(PHPExcel_Cell::stringFromColumnIndex($target[0] + $i3) . ($target[1] + $dynamicTemplates['open_stock'][1] + 5), $discount['quantity'], PHPExcel_Cell_DataType::TYPE_STRING);

            $i3++;
          }
        }
      }
      
      
      ]]></add>
    </operation>
    <operation>
      <search position="before"><![CDATA[$source = array(0,2 + $this->productSize*($progress['importedCount']));]]></search>
      <add><![CDATA[$map['product_open_stock'] = array(4,26);]]></add>
    </operation>
    <operation>
      <search position="before"><![CDATA[// Layouts (Design)]]></search>
      <add><![CDATA[
      
        // Open Stock
        $i = 0;
        $openStockCombination = $productSheetObj->getCell(PHPExcel_Cell::stringFromColumnIndex($source[0] + $map['product_open_stock'][0] + $i) . ($source[1] + $map['product_open_stock'][1]))->getValue();
        $product_open_stock = array();
        while(!empty($openStockCombination)) {
          $open_stock_price = (float)str_replace(array(' ', ','), array('', '.'), trim($productSheetObj->getCell(PHPExcel_Cell::stringFromColumnIndex($source[0] + $map['product_open_stock'][0] + $i) . ($source[1] + $map['product_open_stock'][1] + 4))->getValue()));
          
          $open_stock_sku = trim($productSheetObj->getCell(PHPExcel_Cell::stringFromColumnIndex($source[0] + $map['product_open_stock'][0] + $i) . ($source[1] + $map['product_open_stock'][1] + 1))->getValue());
          
          $open_stock_weight = str_replace(array(' ', ','), array('', '.'), trim($productSheetObj->getCell(PHPExcel_Cell::stringFromColumnIndex($source[0] + $map['product_open_stock'][0] + $i) . ($source[1] + $map['product_open_stock'][1] + 2))->getValue()));
          
          $open_stock_stock = trim($productSheetObj->getCell(PHPExcel_Cell::stringFromColumnIndex($source[0] + $map['product_open_stock'][0] + $i) . ($source[1] + $map['product_open_stock'][1] + 3))->getValue());
          
          $open_stock_status = trim($productSheetObj->getCell(PHPExcel_Cell::stringFromColumnIndex($source[0] + $map['product_open_stock'][0] + $i) . ($source[1] + $map['product_open_stock'][1] + 5))->getValue()) == 'Enabled' ? 1 : 0;

          $open_stock_image = trim($productSheetObj->getCell(PHPExcel_Cell::stringFromColumnIndex($source[0] + $map['product_open_stock'][0] + $i) . ($source[1] + $map['product_open_stock'][1] + 6))->getValue());

          $option_stock_values = (array_map('trim', explode('|', $openStockCombination)));
          
          if ($openStockCombination == ':special:') {
            $product_open_stock[count($product_open_stock) - 1]['specials'][] = array(
              'customer_group_id' => $this->getCustomerGroupId($open_stock_sku),
              'price' => $open_stock_price,
              'date_start' => $open_stock_weight,
              'date_end' => $open_stock_stock
            );
          } else if ($openStockCombination == ':discount:') {
            $product_open_stock[count($product_open_stock) - 1]['discounts'][] = array(
              'customer_group_id' => $this->getCustomerGroupId($open_stock_sku),
              'price' => $open_stock_price,
              'date_start' => $open_stock_weight,
              'date_end' => $open_stock_stock,
              'quantity' => trim($productSheetObj->getCell(PHPExcel_Cell::stringFromColumnIndex($source[0] + $map['product_open_stock'][0] + $i) . ($source[1] + $map['product_open_stock'][1] + 5))->getValue())
            );
          } else {

              $product_open_stock[] = array(
                'var_texts' => $option_stock_values,
                'image' => $open_stock_image,
                'sku' => $open_stock_sku,
                'weight' => $open_stock_weight,
                'stock' => $open_stock_stock,
                'price' => $open_stock_price,
                'specials' => array(),
                'discounts' => array(),
                'subtract' => 1,
                'active' => $open_stock_status
              );
          }
          
          $i++;
          $openStockCombination = $productSheetObj->getCell(PHPExcel_Cell::stringFromColumnIndex($source[0] + $map['product_open_stock'][0] + $i) . ($source[1] + $map['product_open_stock'][1]))->getValue();
        }
        
      ]]></add>
    </operation>
    <operation>
      <search position="after"><![CDATA['product_image' => $product_image,]]></search>
      <add><![CDATA['product_open_stock' => $product_open_stock,]]></add>
    </operation>
    
    <operation>
        <search position="before"><![CDATA[if (isset($data['product_option'])) {]]></search>
        <add><![CDATA[ if (!empty($data['custom_has_options'])) ]]></add>
        </operation>
        <operation>
                <search position="after"><![CDATA[/* OPENSTOCK_HOOK */]]></search>
                <add><![CDATA[
                  if (empty($specific_field) || !empty($specific_field['option stock'])) {
                    if (!empty($data['custom_has_options']) && !empty($data['product_open_stock'])) {
                      $this->db->query("DELETE FROM `" . DB_PREFIX . "product_option_variant_special` WHERE `product_id` = '" . (int)$product_id. "'");
                      $this->db->query("DELETE FROM `" . DB_PREFIX . "product_option_variant_discount` WHERE `product_id` = '" . (int)$product_id. "'");

                      if (!empty($data['custom_has_options']) && $data['custom_has_options'] == '1') {
                          $this->db->query("DELETE FROM `" . DB_PREFIX . "product_option_variant_special` WHERE `product_id` = '" . (int)$product_id. "'");
                          $this->db->query("DELETE FROM `" . DB_PREFIX . "product_option_variant_discount` WHERE `product_id` = '" . (int)$product_id. "'");
                          $this->db->query("DELETE FROM `" . DB_PREFIX . "product_option_variant` WHERE `product_id` = '" . (int)$product_id . "'");
                          $this->db->query("DELETE FROM `" . DB_PREFIX . "product_option_variant_value` WHERE `product_id` = '" . (int)$product_id . "'");

                          $this->load->model('extension/module/openstock');
                          $all_variants = $this->model_extension_module_openstock->calculateVariants($product_id);

                          $data['variant'] = array();

                          $i = 1;

                          foreach ($data['product_open_stock'] as $product_open_stock_item) {
                              $my_variant_ids = array();
                              $variant_values = array();

                              foreach ($product_open_stock_item['var_texts'] as $pov_name) {
                                  $value_query = $this->db->query("SELECT * FROM " . DB_PREFIX . "product_option_value pov LEFT JOIN " . DB_PREFIX . "option_value_description ovd ON (ovd.option_value_id = pov.option_value_id) WHERE TRIM(ovd.name)='" . $this->db->escape(trim($pov_name)) . "' AND pov.product_id='" . (int)$product_id . "' ORDER BY pov.product_id ASC LIMIT 0,1");

                                  if (isset($value_query->row['name'])) {
                                      $my_variant_ids[] = $value_query->row['product_option_value_id'];
                                      $variant_values[$i++] = $value_query->row['product_option_value_id'];
                                  }
                              }

                              sort($my_variant_ids);
                              $variant_string = implode(':', $my_variant_ids);

                              $data['variant'][] = array(
                                  'variant_string' => $variant_string,
                                  'variant_values' => $variant_values,
                                  'product_id' => (int)$product_id,
                                  'sku' => $product_open_stock_item['sku'],
                                  'stock' => $product_open_stock_item['stock'],
                                  'active' => $product_open_stock_item['active'],
                                  'subtract' => $product_open_stock_item['subtract'],
                                  'price' => $product_open_stock_item['price'],
                                  'image' => $product_open_stock_item['image'],
                                  'weight' => $product_open_stock_item['weight'],
                                  'discounts' => $product_open_stock_item['discounts'],
                                  'specials' => $product_open_stock_item['specials']
                              );
                          }

                          foreach ($data['variant'] as $variant) {
                              if (array_key_exists($variant['variant_string'], $all_variants)) {
                                  unset($all_variants[$variant['variant_string']]);

                                  $this->db->query("
                                      INSERT INTO `" . DB_PREFIX . "product_option_variant`
                                      SET
                                           `product_id`    = '" . (int)$product_id . "',
                                           `sku`           = '" . $this->db->escape($variant['sku']) . "',
                                           `stock`         = '" . (int)$variant['stock'] . "',
                                           `active`        = '" . (int)$variant['active'] . "',
                                           `subtract`      = '" . (int)$variant['subtract'] . "',
                                           `price`         = '" . (float)$variant['price'] . "',
                                           `image`         = '" . $this->db->escape($variant['image']) . "',
                                           `weight`        = '" . $this->db->escape($variant['weight']) . "'
                                  ");

                                  $variant_id = $this->db->getLastId();

                                  foreach ($variant['variant_values'] as $sort_order => $variant_value) {
                                      $this->db->query("
                                          INSERT INTO `" . DB_PREFIX . "product_option_variant_value`
                                          SET
                                               `product_option_variant_id`  = '" . (int)$variant_id . "',
                                               `product_option_value_id`    = '" . (int)$variant_value . "',
                                               `product_id`                 = '" . (int)$product_id . "',
                                               `sort_order`                 = '" . (int)$sort_order . "'
                                      ");
                                  }

                                  foreach ($variant['discounts'] as $discount) {
                                      $this->db->query("
                                          INSERT INTO `" . DB_PREFIX . "product_option_variant_discount`
                                          SET
                                              `product_option_variant_id`     = '" . (int)$variant_id . "',
                                              `product_id`                    = '" . (int)$product_id . "',
                                              `customer_group_id`             = '" . (int)$discount['customer_group_id'] . "',
                                              `quantity`                      = '" . (int)$discount['quantity'] . "',
                                              `price`                         = '" . (float)$discount['price'] . "',
                                              `date_start`                    = '" . $this->db->escape($discount['date_start']) . "',
                                              `date_end`                      = '" . $this->db->escape($discount['date_end']) . "'
                                      ");
                                  }

                                  foreach ($variant['specials'] as $special) {
                                      $this->db->query("
                                          INSERT INTO " . DB_PREFIX . "product_option_variant_special
                                          SET
                                              `product_option_variant_id`     = '" . (int)$variant_id . "',
                                              `product_id`                    = '" . (int)$product_id . "',
                                              `customer_group_id`             = '" . (int)$special['customer_group_id'] . "',
                                              `price`                         = '" . (float)$special['price'] . "',
                                              `date_start`                    = '" . $this->db->escape($special['date_start']) . "',
                                              `date_end`                      = '" . $this->db->escape($special['date_end']) . "'
                                      ");
                                  }

                              }
                          }

                          foreach ($all_variants as $new_variant) {
                              $this->db->query("
                                  INSERT INTO `" . DB_PREFIX . "product_option_variant`
                                  SET
                                      `product_id`    = '" . (int)$product_id . "',
                                      `sku`           = '',
                                      `stock`         = '" . (int)$this->config->get('openstock_default_stock') . "',
                                      `active`        = '" . (int)$this->config->get('openstock_default_active') . "',
                                      `subtract`      = '" . (int)$this->config->get('openstock_default_subtract') . "',
                                      `price`         = '0.00',
                                      `image`         = '',
                                      `weight`        = '0.00'
                              ");

                              $variant_id = $this->db->getLastId();

                              foreach ($new_variant as $new_variant_value) {
                                  $this->db->query("
                                      INSERT INTO `" . DB_PREFIX . "product_option_variant_value`
                                      SET
                                          `product_option_variant_id`  = '" . (int)$variant_id . "',
                                          `product_option_value_id`    = '" . (int)$new_variant_value . "',
                                          `product_id`                 = '" . (int)$product_id . "',
                                          `sort_order`                 = '" . (int)$i++ . "'
                                  ");
                              }
                          }
                          

                      } else if (!empty($data['custom_has_options']) && $data['custom_has_options'] == '2') {
                          $this->db->query("DELETE FROM `" . DB_PREFIX . "product_option_variant` WHERE `product_id` = '" . (int)$product_id. "'");
                          $this->db->query("DELETE FROM `" . DB_PREFIX . "product_option_variant_value` WHERE `product_id`= '" . (int)$product_id. "'");
                      } else {
                          $this->db->query("DELETE FROM `" . DB_PREFIX . "product_option` WHERE `product_id` = '" . (int)$product_id . "'");
                          $this->db->query("DELETE FROM `" . DB_PREFIX . "product_option_value` WHERE `product_id` = '" . (int)$product_id . "'");
                      }
                    }
                  }
                ]]></add>
        </operation>
    <operation>
                <search position="replace"><![CDATA[model = '" . $this->db->escape($data['model']) . "', sku = '" . $this->db->escape($data['sku']) . "', ]]></search>
                <add><![CDATA[model = '" . $this->db->escape($data['model']) . "', sku = '" . $this->db->escape($data['sku']) . "', has_option = '" . (int)$this->db->escape($data['custom_has_options']) . "', ]]></add>
        </operation>
  </file>

  <file name="admin/model/extension/module/excelport_product_bulk.php">
    <operation>
      <search position="replace"><![CDATA[$metaSheet = 9;]]></search>
      <add><![CDATA[
        $openstockSheet = 10;
        $metaSheet = 9;]]></add>
    </operation>

    <operation>
      <search position="after"><![CDATA[$designSheetObj = $objPHPExcel->setActiveSheetIndex($designSheet);]]></search>
      <add><![CDATA[
        $objPHPExcel->createSheet($openstockSheet);
        $openstockSheetObj = $objPHPExcel->setActiveSheetIndex($openstockSheet);
        $openstockSheetObj->setTitle("Option Stock");
      ]]></add>
    </operation>

    <operation>
      <search position="after"><![CDATA['reward' => array(0,2),]]></search>
      <add><![CDATA[
        'openstock' => array(0,2),
      ]]></add>
    </operation>

    <operation>
      <search position="before"><![CDATA[$productRewards = $this->model_catalog_product->getProductRewards($row['product_id']);]]></search>
      <add><![CDATA[
        // Open Stock
        $this->load->model('tool/image');
        $this->load->model('extension/module/openstock');
        
        $productOpenStocks = $this->model_extension_module_openstock->getVariants($row['product_id']);
        
        foreach ($productOpenStocks as $productOpenStock) {
          
          $var = $productOpenStock['variant_values'];
          $resulting_var = array();
          foreach ($var as $item) {
            if (isset($productOpenStock['option_values'][$item['product_option_value_id']]) && trim($productOpenStock['option_values'][$item['product_option_value_id']]) !== '') {
              $resulting_var[] = $productOpenStock['option_values'][$item['product_option_value_id']];
            }
          }

          $openstockSheetObj->setCellValueExplicit(PHPExcel_Cell::stringFromColumnIndex($t['openstock'][0] + 0) . (1), 'Product ID', PHPExcel_Cell_DataType::TYPE_STRING);

          $openstockSheetObj->setCellValueExplicit(PHPExcel_Cell::stringFromColumnIndex($t['openstock'][0] + 1) . (1), 'Option Value Combination', PHPExcel_Cell_DataType::TYPE_STRING);
          
          $openstockSheetObj->setCellValueExplicit(PHPExcel_Cell::stringFromColumnIndex($t['openstock'][0] + 2) . (1), 'SKU', PHPExcel_Cell_DataType::TYPE_STRING);
          
          $openstockSheetObj->setCellValueExplicit(PHPExcel_Cell::stringFromColumnIndex($t['openstock'][0] + 3) . (1), 'Weight', PHPExcel_Cell_DataType::TYPE_STRING);
          
          $openstockSheetObj->setCellValueExplicit(PHPExcel_Cell::stringFromColumnIndex($t['openstock'][0] + 4) . (1), 'Stock', PHPExcel_Cell_DataType::TYPE_STRING);
          
          $openstockSheetObj->setCellValueExplicit(PHPExcel_Cell::stringFromColumnIndex($t['openstock'][0] + 5) . (1), 'Price', PHPExcel_Cell_DataType::TYPE_STRING);
          
          $openstockSheetObj->setCellValueExplicit(PHPExcel_Cell::stringFromColumnIndex($t['openstock'][0] + 6) . (1), 'Status', PHPExcel_Cell_DataType::TYPE_STRING);
          
          $openstockSheetObj->setCellValueExplicit(PHPExcel_Cell::stringFromColumnIndex($t['openstock'][0] + 7) . (1), 'Image', PHPExcel_Cell_DataType::TYPE_STRING);

          $openstockSheetObj->setCellValueExplicit(PHPExcel_Cell::stringFromColumnIndex($t['openstock'][0] + 8) . (1), 'Subtract', PHPExcel_Cell_DataType::TYPE_STRING);
          
          $openstockSheetObj->setCellValueExplicit(PHPExcel_Cell::stringFromColumnIndex($t['openstock'][0] + 9) . (1), 'Special Customer Group', PHPExcel_Cell_DataType::TYPE_STRING);
          
          $openstockSheetObj->setCellValueExplicit(PHPExcel_Cell::stringFromColumnIndex($t['openstock'][0] + 10) . (1), 'Special Date Start', PHPExcel_Cell_DataType::TYPE_STRING);
          
          $openstockSheetObj->setCellValueExplicit(PHPExcel_Cell::stringFromColumnIndex($t['openstock'][0] + 11) . (1), 'Special Date End', PHPExcel_Cell_DataType::TYPE_STRING);
          
          $openstockSheetObj->setCellValueExplicit(PHPExcel_Cell::stringFromColumnIndex($t['openstock'][0] + 12) . (1), 'Special Price', PHPExcel_Cell_DataType::TYPE_STRING);
          
          $openstockSheetObj->setCellValueExplicit(PHPExcel_Cell::stringFromColumnIndex($t['openstock'][0] + 13) . (1), 'Discount Customer Group', PHPExcel_Cell_DataType::TYPE_STRING);
          
          $openstockSheetObj->setCellValueExplicit(PHPExcel_Cell::stringFromColumnIndex($t['openstock'][0] + 14) . (1), 'Discount Date Start', PHPExcel_Cell_DataType::TYPE_STRING);
          
          $openstockSheetObj->setCellValueExplicit(PHPExcel_Cell::stringFromColumnIndex($t['openstock'][0] + 15) . (1), 'Discount Date End', PHPExcel_Cell_DataType::TYPE_STRING);
          
          $openstockSheetObj->setCellValueExplicit(PHPExcel_Cell::stringFromColumnIndex($t['openstock'][0] + 16) . (1), 'Discount Price', PHPExcel_Cell_DataType::TYPE_STRING);
          
          $openstockSheetObj->setCellValueExplicit(PHPExcel_Cell::stringFromColumnIndex($t['openstock'][0] + 17) . (1), 'Discount Quantity', PHPExcel_Cell_DataType::TYPE_STRING);

          $styleMap = array(
            'alignment' => array(
              'horizontal' => 'left',
              'vertical' => 'center'
            ),
            'font' => array(
              'color' => array(
                'rgb' => 'ffffff'
              ),
              'bold' => true
            ),
            'fill' => array(
              'type' => PHPExcel_Style_Fill::FILL_SOLID,
              'color' => array(
                'rgb' => '254061'
              )
            )
          );

          $openstockSheetObj->getStyle('A1:ZZ1')->applyFromArray($styleMap);

          if (!empty($resulting_var)) {
            $var_text = implode('|', $resulting_var);

            $openstockSheetObj->setCellValueExplicit(PHPExcel_Cell::stringFromColumnIndex($t['openstock'][0] + 0) . ($t['openstock'][1]), $row['product_id'], PHPExcel_Cell_DataType::TYPE_STRING);

            $openstockSheetObj->setCellValueExplicit(PHPExcel_Cell::stringFromColumnIndex($t['openstock'][0] + 1) . ($t['openstock'][1]), $var_text, PHPExcel_Cell_DataType::TYPE_STRING);
            
            $openstockSheetObj->setCellValueExplicit(PHPExcel_Cell::stringFromColumnIndex($t['openstock'][0] + 2) . ($t['openstock'][1]), $productOpenStock['sku'], PHPExcel_Cell_DataType::TYPE_STRING);
            
            $openstockSheetObj->setCellValueExplicit(PHPExcel_Cell::stringFromColumnIndex($t['openstock'][0] + 3) . ($t['openstock'][1]), $productOpenStock['weight'], PHPExcel_Cell_DataType::TYPE_STRING);
            
            $openstockSheetObj->setCellValueExplicit(PHPExcel_Cell::stringFromColumnIndex($t['openstock'][0] + 4) . ($t['openstock'][1]), $productOpenStock['stock'], PHPExcel_Cell_DataType::TYPE_STRING);
            
            $openstockSheetObj->setCellValueExplicit(PHPExcel_Cell::stringFromColumnIndex($t['openstock'][0] + 5) . ($t['openstock'][1]), $productOpenStock['price'], PHPExcel_Cell_DataType::TYPE_STRING);
            
            $openstockSheetObj->setCellValueExplicit(PHPExcel_Cell::stringFromColumnIndex($t['openstock'][0] + 6) . ($t['openstock'][1]), !empty($productOpenStock['active']) ? 'Enabled' : 'Disabled', PHPExcel_Cell_DataType::TYPE_STRING);
            
            $openstockSheetObj->setCellValueExplicit(PHPExcel_Cell::stringFromColumnIndex($t['openstock'][0] + 7) . ($t['openstock'][1]), $productOpenStock['image'], PHPExcel_Cell_DataType::TYPE_STRING);

            $openstockSheetObj->setCellValueExplicit(PHPExcel_Cell::stringFromColumnIndex($t['openstock'][0] + 8) . ($t['openstock'][1]), !empty($productOpenStock['subtract']) ? 'Yes' : 'No', PHPExcel_Cell_DataType::TYPE_STRING);

            $extra_columns = array();
            $extra_column_i = 0;

            foreach ($productOpenStock['specials'] as $special) {
              $extra_columns[$extra_column_i][9] = $this->getCustomerGroupName($special['customer_group_id']);
              $extra_columns[$extra_column_i][10] = $special['date_start'];
              $extra_columns[$extra_column_i][11] = $special['date_end'];
              $extra_columns[$extra_column_i][12] = $special['price'];
              $extra_column_i++;
            }

            $extra_column_i = 0;
            foreach ($productOpenStock['discounts'] as $discount) {
              $extra_columns[$extra_column_i][13] = $this->getCustomerGroupName($discount['customer_group_id']);
              $extra_columns[$extra_column_i][14] = $discount['date_start'];
              $extra_columns[$extra_column_i][15] = $discount['date_end'];
              $extra_columns[$extra_column_i][16] = $discount['price'];
              $extra_columns[$extra_column_i][17] = $discount['quantity'];
              $extra_column_i++;
            }

            foreach ($extra_columns as $extra_column_row => $extra_data) {
              foreach ($extra_data as $cell_column => $cell_data) {
                $openstockSheetObj->setCellValueExplicit(PHPExcel_Cell::stringFromColumnIndex($t['openstock'][0] + $cell_column) . ($t['openstock'][1]), $cell_data, PHPExcel_Cell_DataType::TYPE_STRING);
              }
            }
            $t['openstock'][1]++;
          }
        }
      ]]></add>
    </operation>

    <operation>
      <search position="after"><![CDATA[$product['product_layout'] = $this->loadBulkSheetData('design', $file, $product_id);]]></search>
      <add><![CDATA[
        $product['product_open_stock'] = $this->loadBulkSheetData('option stock', $file, $product_id);
      ]]></add>
    </operation>

    <operation>
      <search position="before"><![CDATA[case 'design' : {]]></search>
      <add><![CDATA[
        case 'option stock' : {
          return $this->getOptionStockRowsByProductId($this->readSheetCache($type), $product_id);
        } break;
      ]]></add>
    </operation>

    <operation>
      <search position="before"><![CDATA[public function getOptionRowsByProductId($sheet, $product_id) {]]></search>
      <add><![CDATA[
        public function getOptionStockRowsByProductId($sheet, $product_id) {
          $data = array();

          $openstock_read_map = array(
            'product_id' => 'A',
            'option_values' => 'B',
            'sku' => 'C',
            'weight' => 'D',
            'stock' => 'E',
            'price' => 'F',
            'status' => 'G',
            'image' => 'H',
            'subtract' => 'I',
            'special_customer_group' => 'J',
            'special_date_start' => 'K',
            'special_date_end' => 'L',
            'special_price' => 'M',
            'discount_customer_group' => 'N',
            'discount_date_start' => 'O',
            'discount_date_end' => 'P',
            'discount_price' => 'Q',
            'discount_quantity' => 'R'
          );

          $this_product_id = null;
          $this_option_values = null;
          $this_sku = null;
          $this_weight = null;
          $this_stock = null;
          $this_price = null;
          $this_status = null;
          $this_image = null;
          $this_special = array();
          $this_discount = array();

          foreach ($sheet as $row) {
            $new_option_row = array();

            foreach ($row as $cell_index => $cell_value) {

              foreach ($openstock_read_map as $map_key => $map_value) {
                if ($cell_index != $map_value) continue;

                $new_option_row[$map_key] = trim($cell_value);
              }
            }

            if (!empty($new_option_row['product_id'])) {
              $this_product_id = (int)$new_option_row['product_id'];
              $this_option_values = (array_map('trim', explode('|', $new_option_row['option_values'])));
              $this_sku = $new_option_row['sku'];
              $this_weight = (float)str_replace(' ', '', $new_option_row['weight']);
              $this_stock = (int)$new_option_row['stock'];
              $this_price = (float)str_replace(' ', '', $new_option_row['price']);
              $this_status = $new_option_row['status'] == 'Enabled';
              $this_image = $new_option_row['image'];
              $this_subtract = $new_option_row['subtract'] == 'Yes';

              if (!empty($this_openstock['product_id']) && $this_openstock['product_id'] == (int)$product_id) {
                $data[] = $this_openstock;
              }

              $this_openstock = array(
                'product_id' => $this_product_id,
                'var_texts' => $this_option_values,
                'sku' => $this_sku,
                'stock' => $this_stock,
                'active' => $this_status,
                'subtract' => $this_subtract,
                'price' => $this_price,
                'image' => $this_image,
                'weight' => $this_weight,
                'specials' => array(),
                'discounts' => array()
              );
            }

            if ((int)$this_product_id != (int)$product_id) {
              continue;
            }

            $this_special_customer_group = $new_option_row['special_customer_group'];
            $this_discount_customer_group = $new_option_row['discount_customer_group'];

            $this_special_customer_group_id = $this->getCustomerGroupIdByName($this_special_customer_group);
            $this_discount_customer_group_id = $this->getCustomerGroupIdByName($this_discount_customer_group);

            if (!empty($this_special_customer_group_id)) {
              $this_openstock['specials'][] = array(
                'customer_group_id' => $this_special_customer_group_id,
                'price' => (float)str_replace(array('+', '-', ' ', ','), array('', '', '', '.'), $new_option_row['special_price']),
                'date_start' => $new_option_row['special_date_start'],
                'date_end' => $new_option_row['special_date_end']
              );
            }

            if (!empty($this_discount_customer_group_id)) {
              $this_openstock['discounts'][] = array(
                'customer_group_id' => $this_discount_customer_group_id,
                'price' => (float)str_replace(array('+', '-', ' ', ','), array('', '', '', '.'), $new_option_row['discount_price']),
                'quantity' => (int)str_replace(' ', '', $new_option_row['discount_quantity']),
                'date_start' => $new_option_row['discount_date_start'],
                'date_end' => $new_option_row['discount_date_end']
              );
            }
          }

          if (!empty($this_openstock['product_id']) && $this_openstock['product_id'] == (int)$product_id) {
            $data[] = $this_openstock;
          }

          return $data;
        }
      ]]></add>
    </operation>
  </file>

  <file error="skip" name="admin/model/extension/module/openstock.php">
    <operation>
      <search position="replace"><![CDATA[return $final;]]></search>
      <add><![CDATA[return $this->reorderKeys($final);]]></add>
    </operation>

    <operation>
      <search position="before"><![CDATA[public function install() {]]></search>
      <add><![CDATA[
        public function reorderKeys($data) {
          if (empty($data)) return $data;

          $result = array();

          foreach ($data as $key => $value) {
            $key_parts = explode(':', $key);
            sort($key_parts);
            $result[implode(':', $key_parts)] = $value;
          }

          return $result;
        }
      ]]></add>
    </operation>
  </file>

  <file error="skip" name="admin/controller/extension/module/openstock.php">
    <operation>
      <search position="after"><![CDATA[foreach ($this->request->post['variant'] as $variant_id => $variant) {]]></search>
      <add><![CDATA[
        $key_parts = explode(':', $variant['variant_string']);
        sort($key_parts);
        $variant['variant_string'] = implode(':', $key_parts);
      ]]></add>
    </operation>
  </file>

</modification>