diff --git a/admin-dev/themes/default/template/controllers/carrier_wizard/helpers/form/form.tpl b/admin-dev/themes/default/template/controllers/carrier_wizard/helpers/form/form.tpl new file mode 100644 index 000000000..eea8649a9 --- /dev/null +++ b/admin-dev/themes/default/template/controllers/carrier_wizard/helpers/form/form.tpl @@ -0,0 +1,39 @@ +{* +* 2007-2013 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2013 PrestaShop SA +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} +{extends file="helpers/form/form.tpl"} +{block name="script"} + var string_price = '{l s="Will be applied when the price will be:" js=1}'; + var string_weight = '{l s="Will be applied when the weight will be:" js=1}'; +{/block} + +{block name="field"} + {if $input.name == 'zones'} + {include file='controllers/carrier_wizard/helpers/form/form_ranges.tpl'} +
+ {l s="Add new range"} +
+ {/if} + {$smarty.block.parent} +{/block} diff --git a/admin-dev/themes/default/template/controllers/carrier_wizard/helpers/form/form_ranges.tpl b/admin-dev/themes/default/template/controllers/carrier_wizard/helpers/form/form_ranges.tpl new file mode 100644 index 000000000..4908e2448 --- /dev/null +++ b/admin-dev/themes/default/template/controllers/carrier_wizard/helpers/form/form_ranges.tpl @@ -0,0 +1,56 @@ +
+ + + + + {foreach from=$ranges key=r item=range} + + {foreachelse} + + {/foreach} + + + + + {foreach from=$ranges key=r item=range} + + {foreachelse} + + {/foreach} + + + + + {foreach from=$ranges key=r item=range} + + {foreachelse} + + {/foreach} + + {foreach from=$zones key=i item=zone} + + + + {foreach from=$ranges key=r item=range} + + {/foreach} + + {/foreach} + + + + {foreach from=$ranges name=ranges key=r item=range} + {if $smarty.foreach.ranges.first} + + {else} + +
>=
<
All + + + + +
{$zone.name}
   
+
diff --git a/admin-dev/themes/default/template/controllers/carrier_wizard/helpers/form/index.php b/admin-dev/themes/default/template/controllers/carrier_wizard/helpers/form/index.php new file mode 100644 index 000000000..30839633c --- /dev/null +++ b/admin-dev/themes/default/template/controllers/carrier_wizard/helpers/form/index.php @@ -0,0 +1,35 @@ + +* @copyright 2007-2013 PrestaShop SA +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); +header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); + +header('Cache-Control: no-store, no-cache, must-revalidate'); +header('Cache-Control: post-check=0, pre-check=0', false); +header('Pragma: no-cache'); + +header('Location: ../../../../../../../../'); +exit; \ No newline at end of file diff --git a/admin-dev/themes/default/template/controllers/shipping/index.php b/admin-dev/themes/default/template/controllers/carrier_wizard/helpers/index.php similarity index 93% rename from admin-dev/themes/default/template/controllers/shipping/index.php rename to admin-dev/themes/default/template/controllers/carrier_wizard/helpers/index.php index fcb7f5c2b..063209789 100644 --- a/admin-dev/themes/default/template/controllers/shipping/index.php +++ b/admin-dev/themes/default/template/controllers/carrier_wizard/helpers/index.php @@ -31,5 +31,5 @@ header('Cache-Control: no-store, no-cache, must-revalidate'); header('Cache-Control: post-check=0, pre-check=0', false); header('Pragma: no-cache'); -header('Location: ../../../../../../'); +header('Location: ../../../../../../../'); exit; \ No newline at end of file diff --git a/admin-dev/themes/default/template/controllers/carrier_wizard/helpers/view/index.php b/admin-dev/themes/default/template/controllers/carrier_wizard/helpers/view/index.php new file mode 100644 index 000000000..30839633c --- /dev/null +++ b/admin-dev/themes/default/template/controllers/carrier_wizard/helpers/view/index.php @@ -0,0 +1,35 @@ + +* @copyright 2007-2013 PrestaShop SA +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); +header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); + +header('Cache-Control: no-store, no-cache, must-revalidate'); +header('Cache-Control: post-check=0, pre-check=0', false); +header('Pragma: no-cache'); + +header('Location: ../../../../../../../../'); +exit; \ No newline at end of file diff --git a/admin-dev/themes/default/template/controllers/carrier_wizard/helpers/view/view.tpl b/admin-dev/themes/default/template/controllers/carrier_wizard/helpers/view/view.tpl new file mode 100644 index 000000000..0be09cf90 --- /dev/null +++ b/admin-dev/themes/default/template/controllers/carrier_wizard/helpers/view/view.tpl @@ -0,0 +1,59 @@ +{* +* 2007-2013 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2013 PrestaShop SA +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +{extends file="helpers/view/view.tpl"} +{block name="override_tpl"} + +
+ + {foreach from=$wizard_contents.contents key=step_nbr item=content} +
+ {$content} +
+ {/foreach} +
+{/block} diff --git a/admin-dev/themes/default/template/controllers/carrier_wizard/logo.tpl b/admin-dev/themes/default/template/controllers/carrier_wizard/logo.tpl new file mode 100644 index 000000000..f9256ec1c --- /dev/null +++ b/admin-dev/themes/default/template/controllers/carrier_wizard/logo.tpl @@ -0,0 +1,98 @@ +{* +* 2007-2013 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2013 PrestaShop SA +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +
+ +

+ + +

+ {l s='Remove the logo'} +

+ {l s='Format:'} JPG, GIF, PNG. {l s='Filesize:'} {$max_image_size|string_format:"%.2f"} {l s='MB max.'} +
{l s='Current size:'} {l s='undefined'}. +

+
+ + \ No newline at end of file diff --git a/admin-dev/themes/default/template/controllers/carrier_wizard/summary.tpl b/admin-dev/themes/default/template/controllers/carrier_wizard/summary.tpl new file mode 100644 index 000000000..42cfd89af --- /dev/null +++ b/admin-dev/themes/default/template/controllers/carrier_wizard/summary.tpl @@ -0,0 +1,63 @@ +{* +* 2007-2013 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2013 PrestaShop SA +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + + + +
+ {l s='Carrier name:'} +
 
+
+
 
+
+
 
+
+
 
+
+ {l s='It will be displayed only for the following zones:'} +
    +
    +
     
    +
    + {l s='It will be displayed only for the following groups:'} +
      +
      +
       
      +
      + {l s='It will be displayed only for the following shops:'} +
        +
        +
        diff --git a/admin-dev/themes/default/template/controllers/carriers/helpers/list/list_content.tpl b/admin-dev/themes/default/template/controllers/carriers/helpers/list/list_content.tpl new file mode 100644 index 000000000..a106c0b2f --- /dev/null +++ b/admin-dev/themes/default/template/controllers/carriers/helpers/list/list_content.tpl @@ -0,0 +1,40 @@ +{* +* 2007-2013 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2013 PrestaShop SA +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +{extends file="helpers/list/list_content.tpl"} + {block name="open_td"} + + {else} + > + {/if} + {/block} diff --git a/admin-dev/themes/default/template/controllers/shipping/content.tpl b/admin-dev/themes/default/template/controllers/shipping/content.tpl deleted file mode 100644 index 4ab2ff01a..000000000 --- a/admin-dev/themes/default/template/controllers/shipping/content.tpl +++ /dev/null @@ -1,105 +0,0 @@ -{* -* 2007-2013 PrestaShop -* -* NOTICE OF LICENSE -* -* This source file is subject to the Academic Free License (AFL 3.0) -* that is bundled with this package in the file LICENSE.txt. -* It is also available through the world-wide-web at this URL: -* http://opensource.org/licenses/afl-3.0.php -* If you did not receive a copy of the license and are unable to -* obtain it through the world-wide-web, please send an email -* to license@prestashop.com so we can send you a copy immediately. -* -* DISCLAIMER -* -* Do not edit or add to this file if you wish to upgrade PrestaShop to newer -* versions in the future. If you wish to customize PrestaShop for your -* needs please refer to http://www.prestashop.com for more information. -* -* @author PrestaShop SA -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*} - -{$content} -

        -

        {l s='Fees by carrier, geographical zone and ranges'}

        -
        -
        - {l s='Fees'} - {if empty($carriers)} - {l s='If you only have free carriers, there\'s no need to configure delivery prices.'} - {else} - {l s='Carrier:'} -
        - - - - - {if !$carrierSelected->is_free} - {foreach $ranges AS $range} - - {/foreach} - {/if} - - {if sizeof($ranges) && !$carrierSelected->is_free} - {if sizeof($zones) > 1} - - - {foreach $ranges AS $range} - - {/foreach} - - {/if} - - {foreach $zones AS $zone} - - - {foreach $ranges AS $range} - {if isset($deliveryArray[$zone['id_zone']][$id_carrier][$range[$rangeIdentifier]])} - {$price = $deliveryArray[$zone['id_zone']][$id_carrier][$range[$rangeIdentifier]]} - {else} - {$price = '0.00'} - {/if} - - {/foreach} - - {/foreach} - {/if} - - - -
        {l s='Zone / Range'}{$range['delimiter1']|floatval}{$suffix} {l s='to'} {$range['delimiter2']|floatval}{$suffix}
        {l s='All'} - {$currency->getSign('left')} - - {$currency->getSign('right')} {l s='(tax excl.)'} -
        {$zone['name']} - {$currency->getSign('left')} - - {$currency->getSign('right')} {l s='(tax excl.)'} -
        - - {if sizeof($ranges) && !$carrierSelected->is_free} - - {else if $carrierSelected->is_free} - {l s='This is a free carrier'} - {else} - {l s='No ranges is set for this carrier'} - {/if} -
        - {/if} - -
        -
        diff --git a/admin-dev/themes/default/template/helpers/form/form.tpl b/admin-dev/themes/default/template/helpers/form/form.tpl index cfae56a76..694486e03 100644 --- a/admin-dev/themes/default/template/helpers/form/form.tpl +++ b/admin-dev/themes/default/template/helpers/form/form.tpl @@ -30,7 +30,7 @@ {if isset($fields.title)}

        {$fields.title}

        {/if} {block name="defaultForm"} -
        + {if $form_id} {/if} diff --git a/classes/Carrier.php b/classes/Carrier.php index 869bb11df..ddda5d357 100644 --- a/classes/Carrier.php +++ b/classes/Carrier.php @@ -165,6 +165,14 @@ class CarrierCore extends ObjectModel public function __construct($id = null, $id_lang = null) { parent::__construct($id, $id_lang); + + /** + * keep retrocompatibility SHIPPING_METHOD_DEFAULT + * @deprecated 1.5.5 + */ + if ($this->shipping_method == Carrier::SHIPPING_METHOD_DEFAULT) + $this->shipping_method = ((int)Configuration::get('PS_SHIPPING_METHOD') ? Carrier::SHIPPING_METHOD_WEIGHT : Carrier::SHIPPING_METHOD_PRICE); + /** * keep retrocompatibility id_tax_rules_group * @deprecated 1.5.0 @@ -370,13 +378,12 @@ class CarrierCore extends ObjectModel */ public static function getDeliveryPriceByRanges($range_table, $id_carrier) { - $range_table = pSQL($range_table); - $sql = 'SELECT d.id_'.$range_table.', d.id_carrier, d.id_zone, d.price + $sql = 'SELECT d.`id_'.bqSQL($range_table).'`, d.id_carrier, d.id_zone, d.price FROM '._DB_PREFIX_.'delivery d - LEFT JOIN '._DB_PREFIX_.$range_table.' r ON r.id_'.$range_table.' = d.id_'.$range_table.' + LEFT JOIN `'._DB_PREFIX_.bqSQL($range_table).'` r ON r.`id_'.bqSQL($range_table).'` = d.`id_'.bqSQL($range_table).'` WHERE d.id_carrier = '.(int)$id_carrier.' - AND d.id_'.$range_table.' IS NOT NULL - AND d.id_'.$range_table.' != 0 + AND d.`id_'.bqSQL($range_table).'` IS NOT NULL + AND d.`id_'.bqSQL($range_table).'` != 0 '.Carrier::sqlDeliveryRangeShop($range_table).' ORDER BY r.delimiter1'; return Db::getInstance()->executeS($sql); @@ -456,6 +463,22 @@ class CarrierCore extends ObjectModel return $carriers; } + public static function getIdTaxRulesGroupMostUsed() + { + return Db::getInstance()->getValue(' + SELECT id_tax_rules_group + FROM ( + SELECT COUNT(*) n, c.id_tax_rules_group + FROM '._DB_PREFIX_.'carrier c + JOIN '._DB_PREFIX_.'tax_rules_group trg ON (c.id_tax_rules_group = trg.id_tax_rules_group) + WHERE trg.active = 1 + GROUP BY c.id_tax_rules_group + ORDER BY n DESC + LIMIT 1 + ) most_used' + ); + } + public static function getDeliveredCountries($id_lang, $active_countries = false, $active_carriers = false, $contain_states = null) { if (!Validate::isBool($active_countries) || !Validate::isBool($active_carriers)) @@ -712,7 +735,7 @@ class CarrierCore extends ObjectModel */ public function deleteDeliveryPrice($range_table) { - $where = '`id_carrier` = '.(int)$this->id.' AND (`id_'.$range_table.'` IS NOT NULL OR `id_'.$range_table.'` = 0) '; + $where = '`id_carrier` = '.(int)$this->id.' AND (`id_'.bqSQL($range_table).'` IS NOT NULL OR `id_'.bqSQL($range_table).'` = 0) '; if (Shop::getContext() == Shop::CONTEXT_ALL) $where .= 'AND id_shop IS NULL AND id_shop_group IS NULL'; @@ -912,9 +935,11 @@ class CarrierCore extends ObjectModel return false; } - public function getRangeObject() + public function getRangeObject($shipping_method = false) { - $shipping_method = $this->getShippingMethod(); + if (!$shipping_method) + $shipping_method = $this->getShippingMethod(); + if ($shipping_method == Carrier::SHIPPING_METHOD_WEIGHT) return new RangeWeight(); elseif ($shipping_method == Carrier::SHIPPING_METHOD_PRICE) @@ -1032,9 +1057,9 @@ class CarrierCore extends ObjectModel $sql = 'AND '.$alias.'.id_delivery = ( SELECT d2.id_delivery FROM '._DB_PREFIX_.'delivery d2 - WHERE d2.id_carrier = '.$alias.'.id_carrier - AND d2.id_zone = '.$alias.'.id_zone - AND d2.id_'.$range_table.' = '.$alias.'.id_'.$range_table.' + WHERE d2.id_carrier = `'.bqSQL($alias).'`.id_carrier + AND d2.id_zone = `'.bqSQL($alias).'`.id_zone + AND d2.`id_'.bqSQL($range_table).'` = `'.bqSQL($alias).'`.`id_'.bqSQL($range_table).'` '.$where.' ORDER BY d2.id_shop DESC, d2.id_shop_group DESC LIMIT 1 diff --git a/classes/ObjectModel.php b/classes/ObjectModel.php index 264a174d9..ed73a2383 100644 --- a/classes/ObjectModel.php +++ b/classes/ObjectModel.php @@ -1632,4 +1632,4 @@ abstract class ObjectModelCore { $this->update_fields = $fields; } -} +} \ No newline at end of file diff --git a/classes/controller/AdminController.php b/classes/controller/AdminController.php index 3145e7d81..f41c1c346 100644 --- a/classes/controller/AdminController.php +++ b/classes/controller/AdminController.php @@ -1286,7 +1286,7 @@ class AdminControllerCore extends Controller $current_id = Tab::getCurrentParentId(); foreach ($tabs as $index => $tab) { - if ($tab['class_name'] == 'AdminStock' && Configuration::get('PS_ADVANCED_STOCK_MANAGEMENT') == 0) + if (($tab['class_name'] == 'AdminStock' && Configuration::get('PS_ADVANCED_STOCK_MANAGEMENT') == 0) || $tab['class_name'] == 'AdminCarrierWizard') { unset($tabs[$index]); continue; @@ -1326,7 +1326,7 @@ class AdminControllerCore extends Controller foreach ($sub_tabs as $index2 => $sub_tab) { // class_name is the name of the class controller - if (Tab::checkTabRights($sub_tab['id_tab']) === true && (bool)$sub_tab['active']) + if (Tab::checkTabRights($sub_tab['id_tab']) === true && (bool)$sub_tab['active'] && $sub_tab['class_name'] != 'AdminCarrierWizard') { $sub_tabs[$index2]['href'] = $this->context->link->getAdminLink($sub_tab['class_name']); $sub_tabs[$index2]['current'] = ($sub_tab['class_name'].'Controller' == get_class($this)); diff --git a/classes/order/Order.php b/classes/order/Order.php index 5d716146a..a4d4db1b0 100644 --- a/classes/order/Order.php +++ b/classes/order/Order.php @@ -254,7 +254,7 @@ class OrderCore extends ObjectModel public function __construct($id = null, $id_lang = null) { parent::__construct($id, $id_lang); - + $is_admin = (is_object(Context::getContext()->controller) && Context::getContext()->controller->controller_type == 'admin'); if ($this->id_customer && !$is_admin) { diff --git a/controllers/admin/AdminCarrierWizardController.php b/controllers/admin/AdminCarrierWizardController.php new file mode 100644 index 000000000..8d6b5858d --- /dev/null +++ b/controllers/admin/AdminCarrierWizardController.php @@ -0,0 +1,817 @@ + +* @copyright 2007-2013 PrestaShop SA +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class AdminCarrierWizardControllerCore extends AdminController +{ + protected $wizard_access; + + public function __construct() + { + $this->display = 'view'; + $this->table = 'carrier'; + $this->identifier = 'id_carrier'; + $this->className = 'Carrier'; + $this->lang = false; + $this->deleted = true; + $this->step_number = 0; + + $this->fieldImageSettings = array( + 'name' => 'logo', + 'dir' => 's' + ); + + parent::__construct(); + + $this->wizard_access = Profile::getProfileAccess($this->context->employee->id_profile, Tab::getIdFromClassName('AdminCarrierWizard')); + } + + public function setMedia() + { + parent::setMedia(); + $this->addJqueryPlugin('smartWizard'); + $this->addJs(_PS_JS_DIR_.'admin_carrier_wizard.js'); + } + + public function initWizard() + { + $this->wizard_steps = array( + 'name' => 'carrier_wizard', + 'steps' => array( + array( + 'title' => $this->l('General'), + 'desc' => $this->l('General'), + ), + array( + 'title' => $this->l('Where and how much ?'), + 'desc' => $this->l('Where and how much ?'), + ), + array( + 'title' => $this->l('What and to who ?'), + 'desc' => $this->l('What and to who ?'), + ), + array( + 'title' => $this->l('Resume'), + 'desc' => $this->l('Resume'), + ), + + )); + + if (Shop::isFeatureActive()) + { + $multistore_step = array( + array( + 'title' => $this->l('MultiStore'), + 'desc' => $this->l('MultiStore'), + ) + ); + array_splice($this->wizard_steps['steps'], 1, 0, $multistore_step); + } + } + + public function renderView() + { + $this->initWizard(); + + if (Tools::getValue('id_carrier') && $this->wizard_access['edit']) + $carrier = $this->loadObject(); + elseif ($this->wizard_access['add']) + $carrier = new Carrier(); + else + { + $this->errors[] = Tools::displayError('You do not have permission to use this wizard.'); + return ; + } + + $this->tpl_view_vars = array( + 'enableAllSteps' => Validate::isLoadedObject($carrier), + 'wizard_steps' => $this->wizard_steps, + 'validate_url' => $this->context->link->getAdminLink('AdminCarrierWizard'), + 'carrierlist_url' => $this->context->link->getAdminLink('AdminCarriers').'&conf='.((int)Validate::isLoadedObject($carrier) ? 4 : 3), + 'wizard_contents' => array( + 'contents' => array( + 0 => $this->renderStepOne($carrier), + 1 => $this->renderStepThree($carrier), + 2 => $this->renderStepFour($carrier), + 3 => $this->renderStepFive(), + )), + 'labels' => array('next' => $this->l('Next'), 'previous' => $this->l('Previous'), 'finish' => $this->l('Finish')) + ); + + if (Shop::isFeatureActive()) + array_splice($this->tpl_view_vars['wizard_contents']['contents'], 1, 0, array(0 => $this->renderStepTwo($carrier))); + + $this->context->smarty->assign(array( + 'max_image_size' => (int)Configuration::get('PS_PRODUCT_PICTURE_MAX_SIZE') / 1024 / 1024, + 'carrier_logo' => (Validate::isLoadedObject($carrier) && file_exists(_PS_SHIP_IMG_DIR_.$carrier->id.'.jpg') ? _THEME_SHIP_DIR_.$carrier->id.'.jpg' : false) + )); + $this->content .= $this->createTemplate('logo.tpl')->fetch(); + $this->addjQueryPlugin(array('ajaxfileupload')); + + return parent::renderView(); + } + + public function initToolbarTitle() + { + $bread_extended = array_unique($this->breadcrumbs); + + if (Tools::getValue('id_carrier')) + $bread_extended[1] = $this->l('Edit'); + else + $bread_extended[1] = $this->l('Add new'); + + $this->toolbar_title = $bread_extended; + } + + public function initToolbar() + { + parent::initToolbar(); + $this->toolbar_btn['back']['href'] = $this->context->link->getAdminLink('AdminCarriers'); + } + + public function renderStepOne($carrier) + { + $this->fields_form = array( + 'form' => array( + 'id_form' => 'step_carrier_general', + 'input' => array( + array( + 'type' => 'text', + 'label' => $this->l('Company:'), + 'name' => 'name', + 'size' => 25, + 'required' => true, + 'hint' => sprintf($this->l('Allowed characters: letters, spaces and %s'), '().-'), + 'desc' => array( + $this->l('Carrier name displayed during checkout'), + $this->l('For in-store pickup, enter 0 to replace the carrier name with your shop name.') + ) + ), + array( + 'type' => 'text', + 'label' => $this->l('Transit time:'), + 'name' => 'delay', + 'lang' => true, + 'required' => true, + 'size' => 41, + 'maxlength' => 128, + 'desc' => $this->l('Estimated delivery time will be displayed during checkout.') + ), + array( + 'type' => 'text', + 'label' => $this->l('Speed Grade:'), + 'name' => 'grade', + 'required' => false, + 'size' => 1, + 'desc' => $this->l('Enter "0" for a longest shipping delay, or "9" for the shortest shipping delay.') + ), + array( + 'type' => 'text', + 'label' => $this->l('URL:'), + 'name' => 'url', + 'size' => 40, + 'desc' => $this->l('Delivery tracking URL: Type \'@\' where the tracking number should appear. It will then be automatically replaced by the tracking number.') + ), + )), + ); + + $fields_value = $this->getStepOneFieldsValues($carrier); + return $this->renderGenericForm(array('form' => $this->fields_form), $fields_value); + } + + public function renderStepTwo($carrier) + { + $this->fields_form = array( + 'form' => array( + 'id_form' => 'step_carrier_shops', + 'input' => array( + array( + 'type' => 'shop', + 'label' => $this->l('Shop association:'), + 'name' => 'checkBoxShopAsso', + ), + )) + ); + $fields_value = $this->getStepTwoFieldsValues($carrier); + return $this->renderGenericForm(array('form' => $this->fields_form), $fields_value); + } + + public function renderStepThree($carrier) + { + $this->fields_form = array( + 'form' => array( + 'id_form' => 'step_carrier_ranges', + 'input' => array( + array( + 'type' => 'radio', + 'label' => $this->l('Apply shipping cost:'), + 'name' => 'is_free', + 'required' => false, + 'class' => 't', + 'values' => array( + array( + 'id' => 'is_free_off', + 'value' => 0, + 'label' => ''.$this->l('Yes').'' + ), + array( + 'id' => 'is_free_on', + 'value' => 1, + 'label' => ''.$this->l('No').'' + ) + ), + 'desc' => $this->l('Apply both regular shipping cost and product-specific shipping costs.') + ), + array( + 'type' => 'radio', + 'label' => $this->l('Shipping and handling:'), + 'name' => 'shipping_handling', + 'required' => false, + 'class' => 't', + 'is_bool' => true, + 'values' => array( + array( + 'id' => 'shipping_handling_on', + 'value' => 1, + 'label' => $this->l('Enabled') + ), + array( + 'id' => 'shipping_handling_off', + 'value' => 0, + 'label' => $this->l('Disabled') + ) + ), + 'desc' => $this->l('Include the shipping and handling costs in the carrier price.') + ), + array( + 'type' => 'radio', + 'label' => $this->l('Billing:'), + 'name' => 'shipping_method', + 'required' => false, + 'class' => 't', + 'br' => true, + 'values' => array( + array( + 'id' => 'billing_price', + 'value' => Carrier::SHIPPING_METHOD_PRICE, + 'label' => $this->l('According to total price') + ), + array( + 'id' => 'billing_weight', + 'value' => Carrier::SHIPPING_METHOD_WEIGHT, + 'label' => $this->l('According to total weight') + ) + ) + ), + array( + 'type' => 'select', + 'label' => $this->l('Tax:'), + 'name' => 'id_tax_rules_group', + 'options' => array( + 'query' => TaxRulesGroup::getTaxRulesGroups(true), + 'id' => 'id_tax_rules_group', + 'name' => 'name', + 'default' => array( + 'label' => $this->l('No Tax'), + 'value' => 0 + ) + ) + ), + array( + 'type' => 'zone', + 'name' => 'zones' + ) + ) + )); + + $tpl_vars = array(); + $fields_value = $this->getStepThreeFieldsValues($carrier); + + $this->getTplRangesVarsAndValues($carrier, &$tpl_vars, &$fields_value); + return $this->renderGenericForm(array('form' => $this->fields_form), $fields_value, $tpl_vars); + } + + protected function getTplRangesVarsAndValues($carrier, $tpl_vars, $fields_value) + { + $tpl_vars['zones'] = Zone::getZones(false); + $carrier_zones = $carrier->getZones(); + $carrier_zones_ids = array(); + if (is_array($carrier_zones)) + foreach ($carrier_zones as $carrier_zone) + $carrier_zones_ids[] = $carrier_zone['id_zone']; + + + $shipping_method = $carrier->getShippingMethod(); + if ($shipping_method == Carrier::SHIPPING_METHOD_FREE) + { + $range_table = array(); + $range_obj = $carrier->getRangeObject($carrier->shipping_method); + $price_by_range = array(); + } + else + { + $range_table = $carrier->getRangeTable(); + $range_obj = $carrier->getRangeObject(); + $price_by_range = Carrier::getDeliveryPriceByRanges($range_table, (int)$carrier->id); + + } + $zones = Zone::getZones(false); + foreach ($zones as $zone) + $fields_value['zones'][$zone['id_zone']] = Tools::getValue('zone_'.$zone['id_zone'], (in_array($zone['id_zone'], $carrier_zones_ids))); + + foreach ($price_by_range as $price) + $tpl_vars['price_by_range'][$price['id_'.$range_table]][$price['id_zone']] = $price['price']; + + $tmp_range = $range_obj->getRanges((int)$carrier->id); + $tpl_vars['ranges'] = array(); + foreach ($tmp_range as $id => $range) + { + $tpl_vars['ranges'][$range['id_'.$range_table]] = $range; + $tpl_vars['ranges'][$range['id_'.$range_table]]['id_range'] = $range['id_'.$range_table]; + } + + // init blank range + if (!count($tpl_vars['ranges'])) + $tpl_vars['ranges'][] = array('id_range' => -1, 'delimiter1' => 0, 'delimiter2' => 100000); + } + + public function renderStepFour($carrier) + { + $this->fields_form = array( + 'form' => array( + 'id_form' => 'step_carrier_conf', + 'input' => array( + array( + 'type' => 'select', + 'label' => $this->l('Out-of-range behavior:'), + 'name' => 'range_behavior', + 'options' => array( + 'query' => array( + array( + 'id' => 0, + 'name' => $this->l('Apply the cost of the highest defined range') + ), + array( + 'id' => 1, + 'name' => $this->l('Disable carrier') + ) + ), + 'id' => 'id', + 'name' => 'name' + ), + 'desc' => $this->l('Out-of-range behavior occurs when none is defined (e.g. when a customer\'s cart weight is greater than the highest range limit)') + ), + array( + 'type' => 'text', + 'label' => $this->l('Maximium package height:'), + 'name' => 'max_height', + 'required' => false, + 'size' => 10, + 'desc' => $this->l('Maximum height managed by this carrier. Set the value to "0," or leave this field blank to ignore.') + ), + array( + 'type' => 'text', + 'label' => $this->l('Maximium package width:'), + 'name' => 'max_width', + 'required' => false, + 'size' => 10, + 'desc' => $this->l('Maximum width managed by this carrier. Set the value to "0," or leave this field blank to ignore.') + ), + array( + 'type' => 'text', + 'label' => $this->l('Maximium package depth:'), + 'name' => 'max_depth', + 'required' => false, + 'size' => 10, + 'desc' => $this->l('Maximum depth managed by this carrier. Set the value to "0," or leave this field blank to ignore.') + ), + array( + 'type' => 'text', + 'label' => $this->l('Maximium package weight:'), + 'name' => 'max_weight', + 'required' => false, + 'size' => 10, + 'desc' => $this->l('Maximum weight managed by this carrier. Set the value to "0," or leave this field blank to ignore.') + ), + array( + 'type' => 'group', + 'label' => $this->l('Group access:'), + 'name' => 'groupBox', + 'values' => Group::getGroups(Context::getContext()->language->id), + 'desc' => $this->l('Mark the groups that are allowed access to this carrier.') + ) + ) + )); + $fields_value = $this->getStepFourFieldsValues($carrier); + + + // Added values of object Group + $carrier_groups = $carrier->getGroups(); + $carrier_groups_ids = array(); + if (is_array($carrier_groups)) + foreach ($carrier_groups as $carrier_group) + $carrier_groups_ids[] = $carrier_group['id_group']; + + $groups = Group::getGroups($this->context->language->id); + + foreach ($groups as $group) + $fields_value['groupBox_'.$group['id_group']] = Tools::getValue('groupBox_'.$group['id_group'], (in_array($group['id_group'], $carrier_groups_ids) || empty($carrier_groups_ids) && !$carrier->id)); + + return $this->renderGenericForm(array('form' => $this->fields_form), $fields_value); + } + + public function renderStepFive() + { + return $this->context->smarty->fetch('controllers/carrier_wizard/summary.tpl'); + } + + public function renderGenericForm($fields_form, $fields_value, $tpl_vars = array()) + { + $helper = new HelperForm(); + $helper->show_toolbar = false; + $helper->table = $this->table; + $helper->default_form_language = $this->context->language->id; + $helper->allow_employee_form_lang = Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG') ? Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG') : 0; + $this->fields_form = array(); + $helper->id = (int)Tools::getValue('id_carrier'); + $helper->identifier = $this->identifier; + $helper->tpl_vars = array_merge(array( + 'fields_value' => $fields_value, + 'languages' => $this->getLanguages(), + 'id_language' => $this->context->language->id + ), $tpl_vars); + $helper->override_folder = 'carrier_wizard/'; + + return $helper->generateForm($fields_form); + } + + public function getStepOneFieldsValues($carrier) + { + return array( + 'id_carrier' => $this->getFieldValue($carrier, 'id_carrier'), + 'name' => $this->getFieldValue($carrier, 'name'), + 'delay' => $this->getFieldValue($carrier, 'delay'), + 'grade' => $this->getFieldValue($carrier, 'grade'), + 'url' => $this->getFieldValue($carrier, 'url'), + ); + } + + public function getStepTwoFieldsValues($carrier) + { + return array('shop' => $this->getFieldValue($carrier, 'shop')); + + } + + public function getStepThreeFieldsValues($carrier) + { + $id_tax_rules_group = (is_object($this->object) && !$this->object->id) ? Carrier::getIdTaxRulesGroupMostUsed() : $this->getFieldValue($carrier, 'id_tax_rules_group'); + + return array( + 'is_free' => $this->getFieldValue($carrier, 'is_free'), + 'id_tax_rules_group' => (int)$id_tax_rules_group, + 'shipping_handling' => $this->getFieldValue($carrier, 'shipping_handling'), + 'shipping_method' => $this->getFieldValue($carrier, 'shipping_method'), + 'range_behavior' => $this->getFieldValue($carrier, 'range_behavior'), + 'zones' => $this->getFieldValue($carrier, 'zones'), + ); + } + + public function getStepFourFieldsValues($carrier) + { + return array( + 'range_behavior' => $this->getFieldValue($carrier, 'shop'), + 'max_height' => $this->getFieldValue($carrier, 'max_height'), + 'max_width' => $this->getFieldValue($carrier, 'max_width'), + 'max_depth' => $this->getFieldValue($carrier, 'max_depth'), + 'max_weight' => $this->getFieldValue($carrier, 'max_weight'), + 'group' => $this->getFieldValue($carrier, 'group'), + ); + } + + + public function ajaxProcessChangeRanges() + { + if ((Validate::isLoadedObject($this->object) && !$this->wizard_access['edit']) || !$this->wizard_access['add']) + { + $this->errors[] = Tools::displayError('You do not have permission to use this wizard.'); + return; + } + if ((!(int)$shipping_method = Tools::getValue('shipping_method')) || !in_array($shipping_method, array(Carrier::SHIPPING_METHOD_PRICE, Carrier::SHIPPING_METHOD_WEIGHT))) + return ; + + $carrier = $this->loadObject(true); + $carrier->shipping_method = $shipping_method; + + $tpl_vars = array(); + $fields_value = $this->getStepThreeFieldsValues($carrier); + $this->getTplRangesVarsAndValues($carrier, &$tpl_vars, &$fields_value); + + $template = $this->createTemplate('controllers/carrier_wizard/helpers/form/form_ranges.tpl'); + $template->assign($tpl_vars); + $template->assign('fields_value', $fields_value); + $template->assign('input', array('type' => 'zone', 'name' => 'zones' )); + + die ($template->fetch()); + } + + public function ajaxProcessValidateStep() + { + $step_number = (int)Tools::getValue('step_number'); + $return = array('has_error' => false); + + if (!$this->wizard_access['edit']) + $this->errors[] = Tools::displayError('You do not have permission to use this wizard.'); + else + { + + if (Shop::isFeatureActive() && $step_number == 2) + { + if (!Tools::getValue('checkBoxShopAsso_carrier')) + { + $return['has_error'] = true; + $return['errors'][] = $this->l('You must choose at least one shop or group shop.'); + } + } + else + $this->validateRules('AdminCarrierWizardControllerCore'); + } + + if (count($this->errors)) + { + $return['has_error'] = true; + $return['errors'] = $this->errors; + } + die(Tools::jsonEncode($return)); + } + + public function processRanges($id_carrier) + { + if (!$this->wizard_access['edit'] || !$this->wizard_access['add']) + { + $this->errors[] = Tools::displayError('You do not have permission to use this wizard.'); + return; + } + + $carrier = new Carrier((int)$id_carrier); + if (!Validate::isLoadedObject($carrier)) + return false; + + $range_inf = Tools::getValue('range_inf'); + $range_sup = Tools::getValue('range_sup'); + $range_type = Tools::getValue('shipping_method'); + + $fees = Tools::getValue('fees'); + + $carrier->deleteDeliveryPrice($carrier->getRangeTable()); + if ($range_type != Carrier::SHIPPING_METHOD_FREE) + { + foreach ($range_inf as $key => $delimiter1) + { + if (!isset($range_sup[$key])) + continue; + + if ($range_type == Carrier::SHIPPING_METHOD_WEIGHT) + $range = new RangeWeight((int)$key); + if ($range_type == Carrier::SHIPPING_METHOD_PRICE) + $range = new RangePrice((int)$key); + + $range->id_carrier = (int)$carrier->id; + $range->delimiter1 = (float)$delimiter1; + $range->delimiter2 = (float)$range_sup[$key]; + $range->save(); + + if (!Validate::isLoadedObject($range)) + return false; + + $price_list = array(); + foreach ($fees as $id_zone => $fee) + $price_list[] = array( + 'id_range_price' => ($range_type == Carrier::SHIPPING_METHOD_PRICE ? (int)$range->id : null), + 'id_range_weight' => ($range_type == Carrier::SHIPPING_METHOD_WEIGHT ? (int)$range->id : null), + 'id_carrier' => (int)$carrier->id, + 'id_zone' => (int)$id_zone, + 'price' => (float)$fee[$key] + ); + + if (!$carrier->addDeliveryPrice($price_list)) + return false; + } + } + + return true; + } + + public function ajaxProcessUploadLogo() + { + if (!$this->wizard_access['edit']) + die(''); + + $allowedExtensions = array('jpeg', 'gif', 'png', 'jpg'); + + $logo = (isset($_FILES['carrier_logo_input']) ? $_FILES['carrier_logo_input'] : false); + if ($logo && !empty($logo['tmp_name']) && $logo['tmp_name'] != 'none' + && (!isset($logo['error']) || !$logo['error']) + && preg_match('/\.(jpe?g|gif|png)$/', $logo['name']) + && is_uploaded_file($logo['tmp_name'])) + { + $file = $logo['tmp_name']; + do $tmp_name = uniqid().'.jpg'; + while (file_exists(_PS_TMP_IMG_DIR_.$tmp_name)); + if (!ImageManager::resize($file, _PS_TMP_IMG_DIR_.$tmp_name)) + die(''); + @unlink($file); + die(''); + } + else + die(''); + } + + public function ajaxProcessFinishStep() + { + $return = array('has_error' => false); + + if (!$this->wizard_access['edit']) + $return = array( + 'has_error' => true, + $return['errors'][] = Tools::displayError('You do not have permission to use this wizard.') + ); + else + { + + if ($id_carrier = Tools::getValue('id_carrier')) + { + $current_carrier = new Carrier((int)$id_carrier); + // if update we duplicate current Carrier + $carrier = $current_carrier->duplicateObject(); + if (Validate::isLoadedObject($carrier)) + { + // Set flag deteled to true for historization + $current_carrier->deleted = true; + $current_carrier->update(); + + // Fill the new carrier object + $this->copyFromPost($carrier, $this->table); + $carrier->position = $current_carrier->position; + $carrier->update(); + } + } + else + { + $carrier = new Carrier(); + $this->copyFromPost($carrier, $this->table); + if (!$carrier->add()) + { + $return['has_error'] = true; + $return['errors'][] = $this->l('An error occurred while saving this carrier.'); + } + } + if (Validate::isLoadedObject($carrier)) + { + if (!$this->changeGroups((int)$carrier->id)) + { + $return['has_error'] = true; + $return['errors'][] = $this->l('An error occurred while saving carrier groups.'); + } + + if (!$this->changeZones((int)$carrier->id)) + { + $return['has_error'] = true; + $return['errors'][] = $this->l('An error occurred while saving carrier zones.'); + } + + if (!$this->processRanges((int)$carrier->id)) + { + $return['has_error'] = true; + $return['errors'][] = $this->l('An error occurred while saving carrier ranges.'); + } + + if (Shop::isFeatureActive() && !$this->updateAssoShop((int)$carrier->id)) + { + $return['has_error'] = true; + $return['errors'][] = $this->l('An error occurred while saving associations of shops.'); + } + + if (!$carrier->setTaxRulesGroup((int)Tools::getValue('id_tax_rules_group'))) + { + $return['has_error'] = true; + $return['errors'][] = $this->l('An error occurred while saving the tax rules group.'); + } + + if (Tools::getValue('logo')) + { + if (Tools::getValue('logo') == 'null' && file_exists(_PS_SHIP_IMG_DIR_.$carrier->id.'.jpg')) + unlink(_PS_SHIP_IMG_DIR_.$carrier->id.'.jpg'); + else + { + $logo = basename(Tools::getValue('logo')); + if (!file_exists(_PS_TMP_IMG_DIR_.$logo) || !copy(_PS_TMP_IMG_DIR_.$logo, _PS_SHIP_IMG_DIR_.$carrier->id.'.jpg')) + { + $return['has_error'] = true; + $return['errors'][] = $this->l('An error occurred while saving carrier logo.'); + } + } + } + $return['id_carrier'] = $carrier->id; + } + } + die(Tools::jsonEncode($return)); + } + + protected function changeGroups($id_carrier, $delete = true) + { + if ($delete) + Db::getInstance()->execute('DELETE FROM '._DB_PREFIX_.'carrier_group WHERE id_carrier = '.(int)$id_carrier); + $groups = Db::getInstance()->executeS('SELECT id_group FROM `'._DB_PREFIX_.'group`'); + foreach ($groups as $group) + if (Tools::getIsset('groupBox') && in_array($group['id_group'], Tools::getValue('groupBox'))) + return Db::getInstance()->execute(' + INSERT INTO '._DB_PREFIX_.'carrier_group (id_group, id_carrier) + VALUES('.(int)$group['id_group'].','.(int)$id_carrier.') + '); + } + + public function changeZones($id) + { + $return = true; + $carrier = new Carrier($id); + if (!Validate::isLoadedObject($carrier)) + die (Tools::displayError('The object cannot be loaded.')); + $zones = Zone::getZones(false); + foreach ($zones as $zone) + if (count($carrier->getZone($zone['id_zone']))) + { + if (!isset($_POST['zone_'.$zone['id_zone']]) || !$_POST['zone_'.$zone['id_zone']]) + $return &= $carrier->deleteZone($zone['id_zone']); + } + else + if (isset($_POST['zone_'.$zone['id_zone']]) && $_POST['zone_'.$zone['id_zone']]) + $return &= $carrier->addZone($zone['id_zone']); + + return $return; + } + + public static function getValidationRules() + { + $step_number = Tools::getValue('step_number'); + $step_fields = array( + 1 => array('name', 'delay', 'grade', 'url'), + 2 => array('is_free', 'id_tax_rules_group', 'shipping_handling', 'shipping_method', 'range_behavior'), + 3 => array('range_behavior', 'max_height', 'max_width', 'max_depth', 'max_weight'), + ); + + if (Shop::isFeatureActive()) + { + $multistore_field = array(array('shop')); + $tmp = $step_fields; + $step_fields = array(1 => $tmp[1]) + $multistore_field; + array_shift($tmp); + foreach ($tmp as $row) + $step_field[] = $row; + } + + $rules = array(); + + if ($step_number == 1) + $rules = Carrier::getValidationRules('Carrier'); + + foreach ($rules as $key_r => $rule) + foreach ($rule as $key_f => $field) + { + if (in_array($key_r, array('required', 'requiredLang'))) + { + if(!in_array($field, $step_fields[$step_number])) + unset($rules[$key_r][$key_f]); + } + else if(!in_array($key_f, $step_fields[$step_number])) + unset($rules[$key_r][$key_f]); + } + return $rules; + } + + public static function displayFieldName($field) + { + return $field; + } +} diff --git a/controllers/admin/AdminCarriersController.php b/controllers/admin/AdminCarriersController.php index 84a51b04d..cd98c934d 100644 --- a/controllers/admin/AdminCarriersController.php +++ b/controllers/admin/AdminCarriersController.php @@ -156,33 +156,16 @@ class AdminCarriersControllerCore extends AdminController parent::__construct(); } + public function initToolbar() + { + parent::initToolbar(); + + if (isset($this->toolbar_btn['new'])) + $this->toolbar_btn['new']['href'] = $this->context->link->getAdminLink('AdminCarrierWizard'); + } + public function renderList() { - $this->displayInformation( - ' '.$this->l('How do I create a new carrier?').' -
        -
          -
        • '.$this->l('Click "Add New."').'
        • -
        • '.$this->l('Fill in the fields and click "Save."').'
        • -
        • '. - $this->l('You need to set a price range -- or weight range -- for which the new carrier will be available.').' '. - $this->l('Under the "Shipping" menu, click either "Price ranges" or "Weight ranges.".').' -
        • -
        • '.$this->l('Click "Add New."').'
        • -
        • '. - $this->l('Select the name of the carrier before defining the price or weight range.').' '. - $this->l('For example, the carrier can be made available for a weight range between 0 and 5lbs. Another carrier can have a range between 5 and 10lbs.').' -
        • -
        • '.$this->l('When you\'re done, click "Save."').'
        • -
        • '.$this->l('Click on the "Shipping" menu.').'
        • -
        • '. - $this->l('You need to set the fees that will be applied for this carrier.').' '. - $this->l('At the bottom on the page -- in the "Fees" section -- select the name of the carrier.').' -
        • -
        • '.$this->l('For each zone, enter a price and then click "Save."').'
        • -
        • '.$this->l('You\'re all set! The new carrier will now be displayed to customers.').'
        • -
        ' - ); $this->_select = 'b.*'; $this->_join = 'LEFT JOIN `'._DB_PREFIX_.'carrier_lang` b ON a.id_carrier = b.id_carrier'.Shop::addSqlRestrictionOnLang('b').' LEFT JOIN `'._DB_PREFIX_.'carrier_tax_rules_group_shop` ctrgs ON (a.`id_carrier` = ctrgs.`id_carrier` @@ -696,6 +679,11 @@ class AdminCarriersControllerCore extends AdminController } } + public function displayEditLink($token = null, $id, $name = null) + { + return ''; + } + } diff --git a/controllers/admin/AdminShippingController.php b/controllers/admin/AdminShippingController.php index 7d804b0f9..58a48a4ce 100644 --- a/controllers/admin/AdminShippingController.php +++ b/controllers/admin/AdminShippingController.php @@ -68,75 +68,11 @@ class AdminShippingControllerCore extends AdminController
      • '.$this->l('Coupons are not taken into account when calculating free shipping').'
      • ', 'submit' => array() - ), - 'billing' => array( - 'title' => $this->l('Billing'), - 'icon' => 'money', - 'fields' => array( - 'PS_SHIPPING_METHOD' => array( - 'title' => $this->l('Billing'), - 'cast' => 'intval', - 'type' => 'radio', - 'choices' => array( - 0 => $this->l('According to total price'), - 1 => $this->l('According to total weight') - ), - 'validation' => 'isBool' - ), - ) - ), + ) ); } - public function initContent() - { - $array_carrier = array(); - $carriers = Carrier::getCarriers($this->context->language->id, true, false, false, null, Carrier::PS_CARRIERS_AND_CARRIER_MODULES_NEED_RANGE); - foreach ($carriers as $key => $carrier) - if ($carrier['is_free']) - unset($carriers[$key]); - else - $array_carrier[] = $carrier['id_carrier']; - $id_carrier = (int)Tools::getValue('id_carrier'); - - if (count($carriers) && isset($array_carrier[0])) - { - if (!$id_carrier) - $id_carrier = (int)$array_carrier[0]; - - $carrierSelected = new Carrier((int)$id_carrier); - } - else - $carrierSelected = new Carrier((int)$id_carrier); - - $currency = $this->context->currency; - $rangeObj = $carrierSelected->getRangeObject(); - $rangeTable = $carrierSelected->getRangeTable(); - $suffix = $carrierSelected->getRangeSuffix(); - - $rangeIdentifier = 'id_'.$rangeTable; - $ranges = $rangeObj->getRanges($id_carrier); - $delivery = Carrier::getDeliveryPriceByRanges($rangeTable, $id_carrier); - $deliveryArray = array(); - foreach ($delivery as $deliv) - $deliveryArray[$deliv['id_zone']][$deliv['id_carrier']][$deliv[$rangeIdentifier]] = $deliv['price']; - - $this->context->smarty->assign(array( - 'zones' => $carrierSelected->getZones(), - 'carriers' => $carriers, - 'ranges' => $ranges, - 'currency' => $currency, - 'deliveryArray' => $deliveryArray, - 'carrierSelected' => $carrierSelected, - 'id_carrier' => $id_carrier, - 'suffix' => $suffix, - 'rangeIdentifier' => $rangeIdentifier, - 'action_fees' => self::$currentIndex.'&token='.$this->token - )); - - parent::initContent(); - } public function postProcess() { diff --git a/css/admin.css b/css/admin.css index 8faeefeba..f02547389 100644 --- a/css/admin.css +++ b/css/admin.css @@ -2401,3 +2401,117 @@ margin-bottom:7px; min-width: 205px; width: 205px; } + + +/******************** CSS Carrier Wizard ************************/ + +#carrier_wizard.swMain{width: 100%;} +#carrier_wizard.swMain ul.anchor{width: 100%;} + +#carrier_wizard.swMain ul.anchor li{ + margin-bottom:10px; + background: transparent url(../img/admin/steps-carrierwizard.png) no-repeat 0 0 !important; + border: medium none; + padding-left: 0; + width:auto; + padding-right: 62px; + padding-top:0 +} + +#carrier_wizard.swMain ul.nbr_steps_3 li{min-width: 29.9%;} +#carrier_wizard.swMain ul.nbr_steps_4 li{min-width: 21.6%;} +#carrier_wizard.swMain ul.nbr_steps_5 li{ min-width: 16.6%;} + +#carrier_wizard.swMain ul.anchor li.disabled{background: transparent url(../img/admin/steps-carrierwizard.png) no-repeat right -64px !important;} +#carrier_wizard.swMain ul.anchor li.selected{background: transparent url(../img/admin/steps-carrierwizard.png) no-repeat right -32px !important;} +#carrier_wizard.swMain ul.anchor li.done{background: transparent url(../img/admin/steps-carrierwizard.png) no-repeat right 0 !important;} + +#carrier_wizard.swMain ul.anchor li a{ + padding: 3px 20px; + width: 100%; + height: auto; + min-height: 24px !important; + border-radius:0; +} + +@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) { /*** IE10 ***/ + #carrier_wizard.swMain ul.anchor li a{padding: 3px 19px 3px 19px;} + #carrier_wizard.swMain ul.anchor li{padding-right: 60px;} + #carrier_wizard.swMain ul.nbr_steps_3 li{ min-width: 30%;} + #carrier_wizard.swMain ul.nbr_steps_4 li{ min-width: 21.7%;} + #carrier_wizard.swMain ul.nbr_steps_5 li{ min-width: 16.7%;} + +} + +.ie9 #carrier_wizard.swMain ul.anchor li a, +.ie8 #carrier_wizard.swMain ul.anchor li a{padding: 3px 19px 3px 19px;} + +.ie9 #carrier_wizard.swMain ul.anchor li, +.ie8 #carrier_wizard.swMain ul.anchor li, +.ie7 #carrier_wizard.swMain ul.anchor li{padding-right: 60px;} + +.ie7 #carrier_wizard.swMain ul.anchor li a{padding: 3px 19px 3px 19px;} + +.ie9 #carrier_wizard.swMain ul.nbr_steps_3 li, +.ie8 #carrier_wizard.swMain ul.nbr_steps_3 li{ min-width: 30%;} + +.ie9 #carrier_wizard.swMain ul.nbr_steps_4 li, +.ie8 #carrier_wizard.swMain ul.nbr_steps_4 li{ min-width: 21.7%;} + +.ie9 #carrier_wizard.swMain ul.nbr_steps_5 li, +.ie8 #carrier_wizard.swMain ul.nbr_steps_5 li{ min-width: 16.7%;} + + +.ie7 #carrier_wizard.swMain ul.nbr_steps_3 li{ width: 312px;} +.ie7 #carrier_wizard.swMain ul.nbr_steps_4 li{ width: 312px;} +.ie7 #carrier_wizard.swMain ul.nbr_steps_5 li{ width: 312px;} + + +#carrier_wizard.swMain ul.anchor li a.disabled { + background: #CCCCCC; + border: none; + box-shadow: none; + cursor: text; +} + +#carrier_wizard.swMain ul.anchor li a.selected, +#carrier_wizard.swMain ul.anchor li a.done, +#carrier_wizard.swMain ul.anchor li a.error { + background: #414A56 !important; + border: none !important; + box-shadow: none; + color: #ffffff; + cursor: text; + margin:0 +} + + +#carrier_wizard.swMain ul.anchor li a .stepNumber {font: bold 23px/21px Verdana,Arial,Helvetica,sans-serif;color: #747C88;padding-bottom: 0;} +#carrier_wizard.swMain ul.anchor li a.selected .stepNumber{color: #ffffff;} +#carrier_wizard.swMain ul.anchor li a.done .stepNumber {color: #A9B6C8;text-shadow: none;} + +#carrier_wizard.swMain ul.anchor li a .stepDesc { + font: bold 13px/12px Verdana,Arial,Helvetica,sans-serif; + color: #747C88; + padding:0 5px; + cursor:pointer +} +#carrier_wizard.swMain ul.anchor li a.selected .stepDesc{color: #ffffff;} +#carrier_wizard.swMain ul.anchor li a.done .stepDesc {color: #A9B6C8;} + +#carrier_wizard.swMain ul.anchor li a .stepDesc small {font: 11px Verdana,Arial,Helvetica,sans-serif;} + +#carrier_wizard.swMain .stepContainer div.content{width:99%} +#carrier_wizard.swMain div.actionBar{width:99.5%} + +#carrier_wizard .border_top {border-top:solid 1px #C0C0C0;} +#carrier_wizard .border_bottom {border-bottom:solid 1px #C0C0C0;} +#carrier_wizard .border_left {border-left:solid 1px #C0C0C0;} +#carrier_wizard .border_right {border-right:solid 1px #C0C0C0;} +#carrier_wizard .border_all {border:solid 1px #C0C0C0;} +#carrier_wizard input.field_error {border : solid 1px red; background-color:#FFCCCC} +#carrier_wizard table td.center {text-align: center} +.new_range {float: left;margin: 20px 0 0 10px;} +#carrier_wizard tr.fees_all { background: #CCCCCC} + +#carrier_wizard #zones_table input[type=text] {width: 45px;} \ No newline at end of file diff --git a/install-dev/data/xml/access.xml b/install-dev/data/xml/access.xml index 97c2e66ea..9b71e93fc 100644 --- a/install-dev/data/xml/access.xml +++ b/install-dev/data/xml/access.xml @@ -51,6 +51,7 @@ + diff --git a/install-dev/data/xml/tab.xml b/install-dev/data/xml/tab.xml index efc6295cc..477d81b3d 100644 --- a/install-dev/data/xml/tab.xml +++ b/install-dev/data/xml/tab.xml @@ -156,11 +156,8 @@ AdminCarriers - - AdminRangePrice - - - AdminRangeWeight + + AdminCarrierWizard AdminLocalization diff --git a/install-dev/langs/br/data/tab.xml b/install-dev/langs/br/data/tab.xml index 27e2d2651..30029ce36 100644 --- a/install-dev/langs/br/data/tab.xml +++ b/install-dev/langs/br/data/tab.xml @@ -64,7 +64,6 @@ - @@ -100,6 +99,5 @@ - diff --git a/install-dev/langs/de/data/tab.xml b/install-dev/langs/de/data/tab.xml index fdda483e3..e09dc6cdc 100644 --- a/install-dev/langs/de/data/tab.xml +++ b/install-dev/langs/de/data/tab.xml @@ -64,7 +64,6 @@ - @@ -100,6 +99,5 @@ - diff --git a/install-dev/langs/en/data/tab.xml b/install-dev/langs/en/data/tab.xml index e6d9c8f35..565cd31ce 100644 --- a/install-dev/langs/en/data/tab.xml +++ b/install-dev/langs/en/data/tab.xml @@ -50,8 +50,6 @@ - - diff --git a/install-dev/langs/es/data/tab.xml b/install-dev/langs/es/data/tab.xml index 0d83e4f2a..80c679e73 100644 --- a/install-dev/langs/es/data/tab.xml +++ b/install-dev/langs/es/data/tab.xml @@ -64,7 +64,6 @@ - @@ -100,6 +99,5 @@ - diff --git a/install-dev/langs/fr/data/tab.xml b/install-dev/langs/fr/data/tab.xml index 0da00ee0b..81b51d5fc 100644 --- a/install-dev/langs/fr/data/tab.xml +++ b/install-dev/langs/fr/data/tab.xml @@ -64,7 +64,6 @@ - @@ -100,6 +99,5 @@ - diff --git a/install-dev/langs/it/data/tab.xml b/install-dev/langs/it/data/tab.xml index cbf510160..35f568c1f 100644 --- a/install-dev/langs/it/data/tab.xml +++ b/install-dev/langs/it/data/tab.xml @@ -64,7 +64,6 @@ - @@ -100,6 +99,5 @@ - diff --git a/install-dev/langs/pl/data/tab.xml b/install-dev/langs/pl/data/tab.xml index beb217285..bd2f9aafd 100644 --- a/install-dev/langs/pl/data/tab.xml +++ b/install-dev/langs/pl/data/tab.xml @@ -64,7 +64,6 @@ - @@ -100,6 +99,5 @@ - diff --git a/install-dev/langs/ru/data/tab.xml b/install-dev/langs/ru/data/tab.xml index 3c835cde1..132c95388 100644 --- a/install-dev/langs/ru/data/tab.xml +++ b/install-dev/langs/ru/data/tab.xml @@ -64,7 +64,6 @@ - @@ -100,6 +99,5 @@ - diff --git a/install-dev/upgrade/sql/1.5.5.0.sql b/install-dev/upgrade/sql/1.5.5.0.sql index 550af18ad..ab0863e69 100644 --- a/install-dev/upgrade/sql/1.5.5.0.sql +++ b/install-dev/upgrade/sql/1.5.5.0.sql @@ -19,6 +19,8 @@ CHANGE `module_name` `module_name` VARCHAR(64) NULL DEFAULT NULL; /* PHP:add_module_to_hook(blockmyaccountfooter, actionModuleRegisterHookAfter); */; /* PHP:add_module_to_hook(blockmyaccount, actionModuleUnRegisterHookAfter); */; /* PHP:add_module_to_hook(blockmyaccountfooter, actionModuleUnRegisterHookAfter); */; +/* PHP:remove_tab(AdminRangePrice); */; +/* PHP:remove_tab(AdminRangeWeight); */; ALTER TABLE `PREFIX_log` ADD `id_employee` INT(10) UNSIGNED NULL DEFAULT NULL AFTER `object_id`; diff --git a/js/admin_carrier_wizard.js b/js/admin_carrier_wizard.js new file mode 100644 index 000000000..f7f893ef0 --- /dev/null +++ b/js/admin_carrier_wizard.js @@ -0,0 +1,417 @@ +/* +* 2007-2013 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2013 PrestaShop SA +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + + +$(document).ready(function() { + bind_inputs(); + initCarrierWizard(); +}); + +function initCarrierWizard() +{ + $("#carrier_wizard").smartWizard({ + 'labelNext' : labelNext, + 'labelPrevious' : labelPrevious, + 'labelFinish' : labelFinish, + 'fixHeight' : 1, + 'onShowStep' : onShowStepCallback, + 'onLeaveStep' : onLeaveStepCallback, + 'onFinish' : onFinishCallback, + 'transitionEffect' : 'slideleft', + 'enableAllSteps' : enableAllSteps + }); + displayRangeType(); +} + +function displayRangeType() +{ + if ($('input[name="shipping_method"]:checked').val() == 1) + string = string_weight; + else + string = string_price; + + $('.range_type').html(string); +} + +function onShowStepCallback() +{ + $('.anchor li a').each( function () { + $(this).parent('li').addClass($(this).attr('class')); + }); + $('#carrier_logo_block').prependTo($('div.content').filter(function() { return $(this).css('display') != 'none' }).children('.defaultForm').children('fieldset')); + resizeWizard(); +} + +function onFinishCallback(obj, context) +{ + $('.wizard_error').remove(); + $.ajax({ + type:"POST", + url : validate_url, + async: false, + dataType: 'json', + data : $('#carrier_wizard .stepContainer .content form').serialize() + '&action=finish_step&ajax=1', + success : function(data) { + if (data.has_error) + { + displayError(data.errors, context.fromStep); + resizeWizard(); + } + else + window.location.href = carrierlist_url; + } + }); +} + +function onLeaveStepCallback(obj, context) +{ + if (context.toStep == nbr_steps) + displaySummary(); + + return validateSteps(context.fromStep); // return false to stay on step and true to continue navigation +} + +function displaySummary() +{ + // used as buffer - you must not replace directly in the translation vars + var tmp; + + // Carrier name + $('#summary_name').html($('#name').val()); + + // Delay and pricing + tmp = summary_translation_meta_informations.replace('@s2', '' + $('#delay_1').val() + ''); + if ($('#is_free_on').attr('checked')) + tmp = tmp.replace('@s1', summary_translation_free); + else + tmp = tmp.replace('@s1', summary_translation_paid); + $('#summary_meta_informations').html(tmp); + + // Tax and calculation mode for the shipping cost + tmp = summary_translation_shipping_cost.replace('@s2', '' + $('#id_tax_rules_group option:selected').text() + ''); + if ($('#billing_price').attr('checked')) + tmp = tmp.replace('@s1', summary_translation_price); + else if ($('#billing_weight').attr('checked')) + tmp = tmp.replace('@s1', summary_translation_weight); + else + tmp = tmp.replace('@s1', '' + summary_translation_undefined + ''); + $('#summary_shipping_cost').html(tmp); + + // Weight or price ranges + $('#summary_range').html(summary_translation_range); + var range_inf = summary_translation_undefined; + var range_sup = summary_translation_undefined; + $('input[name$="range_inf[]"]').each(function(){ + if (!isNaN(parseFloat($(this).val())) && (range_inf == summary_translation_undefined || range_inf < $(this).val())) + range_inf = $(this).val(); + }); + $('input[name$="range_sup[]"]').each(function(){ + if (!isNaN(parseFloat($(this).val())) && (range_sup == summary_translation_undefined || range_sup > $(this).val())) + range_sup = $(this).val(); + }); + $('#summary_range').html( + $('#summary_range').html() + .replace('@s1', '' + range_inf + '') + .replace('@s2', '' + range_sup + '') + .replace('@s3', '' + $('#range_behavior option:selected').text().toLowerCase() + '') + ); + + // Delivery zones + $('#summary_zones').html(''); + $('.input_zone').each(function(){ + if ($(this).attr('checked')) + $('#summary_zones').html($('#summary_zones').html() + '
      • ' + $(this).parent().prev().text() + '
      • '); + }); + + // Group restrictions + $('#summary_groups').html(''); + $('input[name$="groupBox[]"]').each(function(){ + if ($(this).attr('checked')) + $('#summary_groups').html($('#summary_groups').html() + '
      • ' + $(this).parent().next().next().text() + '
      • '); + }); + + // shop restrictions + $('#summary_shops').html(''); + $('.input_shop').each(function(){ + if ($(this).attr('checked')) + $('#summary_shops').html($('#summary_shops').html() + '
      • ' + $(this).parent().text() + '
      • '); + }); +} + +function validateSteps(step_number) +{ + $('.wizard_error').remove(); + var is_ok = true; + form = $('#carrier_wizard #step-'+step_number+' form'); + $.ajax({ + type:"POST", + url : validate_url, + async: false, + dataType: 'json', + data : form.serialize()+'&step_number='+step_number+'&action=validate_step&ajax=1', + success : function(datas) + { + if (datas.has_error) + { + is_ok = false; + + $('input').focus( function () { + $(this).removeClass('field_error'); + }); + displayError(datas.errors, step_number); + resizeWizard(); + } + } + }); + return is_ok; +} + +function displayError(errors, step_number) +{ + $('.wizard_error').remove(); + str_error = '
        X
          '; + for (var error in errors) + { + $('#carrier_wizard').smartWizard('setError',{stepnum:step_number,iserror:true}); + $('input[name="'+error+'"]').addClass('field_error'); + str_error += '
        • '+errors[error]+'
        • '; + } + $('#step-'+step_number).prepend(str_error+'
        '); +} + +function resizeWizard() +{ + resizeInterval = setInterval(function (){$("#carrier_wizard").smartWizard('fixHeight'); clearInterval(resizeInterval)}, 100); +} + +function bind_inputs() +{ + $('tr.delete_range td button').off('click').on('click', function () { + index = $(this).parent('td').index(); + $('tr.range_sup td:eq('+index+'), tr.range_inf td:eq('+index+'), tr.fees_all td:eq('+index+'), tr.delete_range td:eq('+index+')').remove(); + $('tr.fees').each( function () { + $(this).children('td:eq('+index+')').remove(); + }); + return false; + }); + + $('tr.fees_all td button').off('click').on('click', function () { + index = $(this).parent('td').index(); + if (validateRange(index)) + enableRange(index); + else + disableRange(index); + return false; + }); + + $('tr.fees td input:checkbox').off('change').on('change', function () { + + if($(this).is(':checked')) + { + $(this).closest('tr').children('td').each( function (){ + index = $(this).index(); + if ($('tr.fees_all td:eq('+index+')').hasClass('validated')) + $(this).children('input:text').removeAttr('disabled'); + }); + } + else + $(this).closest('tr').children('td').children('input:text').attr('disabled', 'disabled'); + return false; + }); + + $('tr.range_sup td input:text, tr.range_inf td input:text').focus( function () { + $(this).removeClass('field_error'); + }); + + $('tr.range_sup td input:text, tr.range_inf td input:text').off('change').on('change', function () { + index = $(this).parent('td').index(); + + if ($('tr.fees_all td:eq('+index+')').hasClass('validated') || $('tr.fees_all td:eq('+index+')').hasClass('not_validated')) + { + if (validateRange(index)) + enableRange(index); + else + disableRange(index); + } + }); + + $('tr.fees_all td input').off('change').on('change', function () { + index = $(this).parent('td').index(); + val = $(this).val(); + $('tr.fees td input:text').not('disabled').val(val); + + return false; + }); + + $('input[name="is_free"]').on('click', function() { + var is_free = $(this); + $("#step_carrier_ranges .margin-form").each(function() { + var field = $(this).children().attr('name'); + if (typeof(field) != 'undefined' && field != 'is_free') + { + if (parseInt(is_free.val())) + { + $(this).hide(); + $(this).prev().hide(); + } + else + { + $(this).show(); + $(this).prev().show(); + } + } + }); + if (parseInt(is_free.val())) + { + $('#zones_table').hide(); + $('.new_range').hide(); + } + else + { + $('#zones_table').show(); + $('.new_range').show(); + } + }); + $('input[name="is_free"]:checked').click(); + + $('input[name="shipping_method"]').on('click', function() { + $.ajax({ + type:"POST", + url : validate_url, + async: false, + dataType: 'html', + data : 'id_carrier='+parseInt($('#id_carrier').val())+'&shipping_method='+parseInt($(this).val())+'&action=changeRanges&ajax=1', + success : function(data) { + $('#zone_ranges').replaceWith(data); + displayRangeType(); + } + }); + }); +} + +function validateRange(index) +{ + //reset error css + $('tr.range_sup td input:text').removeClass('field_error'); + $('tr.range_inf td input:text').removeClass('field_error'); + + is_ok = true; + range_sup = parseInt($('tr.range_sup td:eq('+index+')').children('input:text').val().trim()); + range_inf = parseInt($('tr.range_inf td:eq('+index+')').children('input:text').val().trim()); + + if (isNaN(range_sup) || range_sup.length === 0) + { + $('tr.range_sup td:eq('+index+')').children('input:text').addClass('field_error'); + is_ok = false; + } + + if (isNaN(range_inf) || range_inf.length === 0) + { + $('tr.range_inf td:eq('+index+')').children('input:text').addClass('field_error'); + is_ok = false; + } + + if (is_ok) + { + if (range_inf >= range_sup) + { + $('tr.range_sup td:eq('+index+')').children('input:text').addClass('field_error'); + $('tr.range_inf td:eq('+index+')').children('input:text').addClass('field_error'); + is_ok = false; + } + //check if previous range is inf only if it's not the first range + if (index > 2) + { + previous_range_sup = parseInt($('tr.range_sup td:eq('+(index -1)+')').children('input:text').val().trim()); + console.log(range_inf+' < '+previous_range_sup); + if (range_inf < previous_range_sup) + { + $('tr.range_inf td:eq('+index+')').children('input:text').addClass('field_error'); + } + } + //check if next range is sup only if it's not the last range + if ($('tr.range_inf td:eq('+(index + 1)+')').length) + { + next_range_inf = parseInt($('tr.range_inf td:eq('+(index +1)+')').children('input:text').val().trim()); + + if ((isNaN(range_sup) || range_sup.length === 0) && range_sup > next_range_inf) + { + $('tr.range_sup td:eq('+index+')').children('input:text').addClass('field_error'); + } + } + + } + return is_ok; +} + +function enableRange(index) +{ + $('tr.fees').each( function () { + //only enable fees for enabled zones + if ($(this).children('td').children('input:checkbox').attr('checked') == 'checked') + $(this).children('td:eq('+index+')').children('input').removeAttr('disabled'); + }); + $('span.fees_all').show(); + $('tr.fees_all td:eq('+index+')').children('input').show().removeAttr('disabled'); + $('tr.fees_all td:eq('+index+')').addClass('validated').removeClass('not_validated'); + $('tr.fees_all td:eq('+index+')').children('button').remove(); +} + +function disableRange(index) +{ + $('tr.fees').each( function () { + //only enable fees for enabled zones + if ($(this).children('td').children('input:checkbox').attr('checked') == 'checked') + $(this).children('td:eq('+index+')').children('input').attr('disabled', 'disabled'); + }); + $('tr.fees_all td:eq('+index+')').children('input').attr('disabled', 'disabled'); + $('tr.fees_all td:eq('+index+')').removeClass('validated').addClass('not_validated'); +} + +function add_new_range() +{ + //add new rand sup input + $('tr.range_sup td:last').after(''); + //add new rand inf input + $('tr.range_inf td:last').after(''); + + $('tr.fees_all td:last').after('