1137 lines
32 KiB
PHP
1137 lines
32 KiB
PHP
|
<?php
|
||
|
/**
|
||
|
* Description of AdminPrivatesSales
|
||
|
*
|
||
|
* @company Antadis
|
||
|
*/
|
||
|
|
||
|
class AdminPrivateSalesController extends ModuleAdminController {
|
||
|
protected $position_identifier = 'id_privatesales';
|
||
|
/**
|
||
|
*
|
||
|
*/
|
||
|
public function __construct() {
|
||
|
|
||
|
$this->bootstrap = true;
|
||
|
$this->table = 'privatesales';
|
||
|
$this->className = 'SaleCore';
|
||
|
$this->identifier = 'id_privatesales';
|
||
|
$this->lang = true;
|
||
|
$this->deleted = false;
|
||
|
$this->colorOnBackground = false;
|
||
|
$this->context = Context::getContext();
|
||
|
$this->explicitSelect = true;
|
||
|
|
||
|
$this->_defaultOrderBy = 'id_privatesales';
|
||
|
parent::__construct();
|
||
|
|
||
|
$position = false ;
|
||
|
|
||
|
$this->_join .= 'LEFT JOIN `'._DB_PREFIX_.'category_lang` cl ON (cl.id_category=a.id_category AND cl.id_lang='.Configuration::get('PS_LANG_DEFAULT').')';
|
||
|
$this->_select .= 'cl.name';
|
||
|
|
||
|
|
||
|
if(Tools::getValue('listby') == "current"){
|
||
|
$this->_where = " AND a.`date_start` <= NOW() AND a.`date_end` > NOW()";
|
||
|
$this->_defaultOrderBy = 'position';
|
||
|
$position = true ;
|
||
|
SaleCore::cleanPositions();
|
||
|
}else if(Tools::getValue('listby') == "past"){
|
||
|
$this->_where = " AND a.`date_end` < NOW() AND a.`archived` = 0";
|
||
|
}else if(Tools::getValue('listby') == "future"){
|
||
|
$this->_where = " AND a.`date_start` > NOW()";
|
||
|
}else if(Tools::getValue('listby') == "archived"){
|
||
|
$this->_where = " AND a.`archived` = 1";
|
||
|
}
|
||
|
$this->fields_list = array(
|
||
|
'id_privatesales' => array(
|
||
|
'title' => $this->l('ID'),
|
||
|
'align' => 'center',
|
||
|
'width' => 25,
|
||
|
'filter_key' => 'a!id_privatesales'
|
||
|
),
|
||
|
'title' => array(
|
||
|
'title' => $this->l('Name')
|
||
|
),
|
||
|
'id_category' => array(
|
||
|
'title' => $this->l('Category parent'),
|
||
|
// 'callback' => "getCategoryName",
|
||
|
'filter_key' => 'cl!name'
|
||
|
),
|
||
|
'date_start' => array(
|
||
|
'title' => $this->l('Date Start'),
|
||
|
'width' => 130,
|
||
|
'align' => 'right',
|
||
|
'type' => 'datetime',
|
||
|
'filter_key' => 'a!date_start'
|
||
|
),
|
||
|
'date_end' => array(
|
||
|
'title' => $this->l('Date End'),
|
||
|
'width' => 130,
|
||
|
'align' => 'right',
|
||
|
'type' => 'datetime',
|
||
|
'filter_key' => 'a!date_end'
|
||
|
),
|
||
|
'date_shipping' => array(
|
||
|
'title' => $this->l('Date Shipping'),
|
||
|
'width' => 130,
|
||
|
'align' => 'right',
|
||
|
'type' => 'date',
|
||
|
'filter_key' => 'a!date_shipping'
|
||
|
),
|
||
|
/*'univers' => array(
|
||
|
'title' => $this->l('Univers'),
|
||
|
'active' => 'status',
|
||
|
'filter_key' => 'a!univers',
|
||
|
'align' => 'text-center',
|
||
|
'type' => 'bool',
|
||
|
'class' => 'fixed-width-sm',
|
||
|
'orderby' => false
|
||
|
),*/
|
||
|
'percent' => array(
|
||
|
'title' => $this->l('%'),
|
||
|
'align' => 'text-center',
|
||
|
'class' => 'fixed-width-sm',
|
||
|
'orderby' => false
|
||
|
),
|
||
|
'active' => array(
|
||
|
'title' => $this->l('Enabled'),
|
||
|
'active' => 'status',
|
||
|
'filter_key' => 'a!active',
|
||
|
'align' => 'text-center',
|
||
|
'type' => 'bool',
|
||
|
'class' => 'fixed-width-sm',
|
||
|
'orderby' => false
|
||
|
),
|
||
|
/*'archived' => array(
|
||
|
'title' => $this->l('Archived'),
|
||
|
'active' => 'archived',
|
||
|
'filter_key' => 'a!archived',
|
||
|
'align' => 'text-center',
|
||
|
'type' => 'bool',
|
||
|
'class' => 'fixed-width-sm',
|
||
|
'orderby' => false
|
||
|
),
|
||
|
'flash' => array(
|
||
|
'title' => $this->l('Sale Flash'),
|
||
|
'active' => 'flash',
|
||
|
'filter_key' => 'a!flash',
|
||
|
'align' => 'text-center',
|
||
|
'type' => 'bool',
|
||
|
'class' => 'fixed-width-sm',
|
||
|
'orderby' => false
|
||
|
),*/
|
||
|
'news' => array(
|
||
|
'title' => $this->l('Sale News'),
|
||
|
'active' => 'news',
|
||
|
'filter_key' => 'a!news',
|
||
|
'align' => 'text-center',
|
||
|
'type' => 'bool',
|
||
|
'class' => 'fixed-width-sm',
|
||
|
'orderby' => false
|
||
|
),
|
||
|
'concours' => array(
|
||
|
'title' => $this->l('Concours'),
|
||
|
'active' => 'concours',
|
||
|
'align' => 'text-center',
|
||
|
'type' => 'bool',
|
||
|
'class' => 'fixed-width-sm',
|
||
|
'orderby' => false
|
||
|
),
|
||
|
'picto' => array(
|
||
|
'title' => $this->l('Picto'),
|
||
|
'active' => 'picto',
|
||
|
'align' => 'text-center',
|
||
|
'type' => 'bool',
|
||
|
'class' => 'fixed-width-sm',
|
||
|
'orderby' => false
|
||
|
),
|
||
|
'extratab' => array(
|
||
|
'title' => $this->l('Extratab'),
|
||
|
'active' => 'extratab',
|
||
|
'align' => 'text-center',
|
||
|
'type' => 'bool',
|
||
|
'class' => 'fixed-width-sm',
|
||
|
'orderby' => false
|
||
|
),
|
||
|
'otherdelay' => array(
|
||
|
'title' => $this->l('Autre livraison'),
|
||
|
'active' => 'otherdelay',
|
||
|
'align' => 'text-center',
|
||
|
'type' => 'bool',
|
||
|
'class' => 'fixed-width-sm',
|
||
|
'orderby' => false
|
||
|
),
|
||
|
);
|
||
|
|
||
|
if($position){
|
||
|
$this->fields_list['position'] = array(
|
||
|
'title' => $this->l('Position'),
|
||
|
'filter_key' => 'a!position',
|
||
|
'position' => 'position',
|
||
|
'align' => 'center'
|
||
|
);
|
||
|
}
|
||
|
|
||
|
|
||
|
$this->actions = array('edit','delete');
|
||
|
|
||
|
if(Shop::isFeatureActive())
|
||
|
{
|
||
|
Context::getContext()->controller->multishop_context = Shop::CONTEXT_ALL;
|
||
|
}
|
||
|
|
||
|
$this->bulk_actions = array(
|
||
|
'delete' => array(
|
||
|
'text' => $this->l('Delete selected'),
|
||
|
'icon' => 'icon-trash',
|
||
|
'confirm' => $this->l('Delete selected items?')
|
||
|
)
|
||
|
);
|
||
|
$this->specificConfirmDelete = false;
|
||
|
|
||
|
}
|
||
|
|
||
|
public function initPageHeaderToolbar()
|
||
|
{
|
||
|
parent::initPageHeaderToolbar();
|
||
|
|
||
|
if ($this->display != 'edit' && $this->display != 'add')
|
||
|
{
|
||
|
$this->page_header_toolbar_btn['new_sales'] = array(
|
||
|
'href' => self::$currentIndex.'&addprivatesales&token='.$this->token,
|
||
|
'desc' => $this->l('Add new sales', null, null, false),
|
||
|
'icon' => 'process-icon-new'
|
||
|
);
|
||
|
$this->page_header_toolbar_btn['all'] = array(
|
||
|
'href' => $this->context->link->getAdminLink('AdminPrivateSales', true),
|
||
|
'desc' => $this->l('All Sales', null, null, false)
|
||
|
);
|
||
|
$this->page_header_toolbar_btn['current'] = array(
|
||
|
'href' => $this->context->link->getAdminLink('AdminPrivateSales', true).'&listby=current',
|
||
|
'desc' => $this->l('Current Sales', null, null, false)
|
||
|
);
|
||
|
$this->page_header_toolbar_btn['future'] = array(
|
||
|
'href' => $this->context->link->getAdminLink('AdminPrivateSales', true).'&listby=future',
|
||
|
'desc' => $this->l('Future Sales', null, null, false)
|
||
|
);
|
||
|
$this->page_header_toolbar_btn['past'] = array(
|
||
|
'href' => $this->context->link->getAdminLink('AdminPrivateSales', true).'&listby=past',
|
||
|
'desc' => $this->l('Past Sales', null, null, false)
|
||
|
);
|
||
|
$this->page_header_toolbar_btn['archived'] = array(
|
||
|
'href' => $this->context->link->getAdminLink('AdminPrivateSales', true).'&listby=archived',
|
||
|
'desc' => $this->l('Archived Sales', null, null, false)
|
||
|
);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public function setMedia(){
|
||
|
parent::setMedia();
|
||
|
|
||
|
$this->context->controller->addJs(_PS_MODULE_DIR_.'privatesales/js/adminsalesdescription.js');
|
||
|
}
|
||
|
|
||
|
public function initToolbar(){
|
||
|
parent::initToolbar();
|
||
|
$this->toolbar_btn['all'] = array(
|
||
|
'href' => $this->context->link->getAdminLink('AdminPrivateSales', true),
|
||
|
'desc' => $this->l('All Sales')
|
||
|
);
|
||
|
$this->toolbar_btn['current'] = array(
|
||
|
'href' => $this->context->link->getAdminLink('AdminPrivateSales', true).'&listby=current',
|
||
|
'desc' => $this->l('Current Sales')
|
||
|
);
|
||
|
$this->toolbar_btn['future'] = array(
|
||
|
'href' => $this->context->link->getAdminLink('AdminPrivateSales', true).'&listby=future',
|
||
|
'desc' => $this->l('Future Sales')
|
||
|
);
|
||
|
$this->toolbar_btn['past'] = array(
|
||
|
'href' => $this->context->link->getAdminLink('AdminPrivateSales', true).'&listby=past',
|
||
|
'desc' => $this->l('Past Sales')
|
||
|
);
|
||
|
$this->toolbar_btn['archived'] = array(
|
||
|
'href' => $this->context->link->getAdminLink('AdminPrivateSales', true).'&listby=archived',
|
||
|
'desc' => $this->l('Archived Sales')
|
||
|
);
|
||
|
|
||
|
$this->context->smarty->assign('toolbar_scroll', 1);
|
||
|
$this->context->smarty->assign('show_toolbar', 1);
|
||
|
$this->context->smarty->assign('toolbar_btn', $this->toolbar_btn);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
*
|
||
|
*/
|
||
|
public function renderForm(){
|
||
|
if (!($obj = $this->loadObject(true)))
|
||
|
return;
|
||
|
$context = Context::getContext();
|
||
|
$id_shop = Context::getContext()->shop->id;
|
||
|
|
||
|
$categories = array();
|
||
|
|
||
|
$busy_categories = array();
|
||
|
foreach(Db::getInstance()->executeS('
|
||
|
SELECT `id_category`
|
||
|
FROM `'._DB_PREFIX_.'privatesales`
|
||
|
'.(Validate::isLoadedObject($this->object)? 'WHERE `id_privatesales` != '.(int) $this->object->id: '').'
|
||
|
') as $c) {
|
||
|
$busy_categories[] = $c['id_category'];
|
||
|
}
|
||
|
|
||
|
foreach(Category::getChildren((int) Configuration::get('PRIVATESALES_ROOT'), (int) $this->context->cookie->id_lang, FALSE) as $c) {
|
||
|
if(!in_array($c['id_category'], $busy_categories)){
|
||
|
$c['id'] = $c['id_category'] ;
|
||
|
$categories[] = $c;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (Tools::isSubmit('id_privatesales')){
|
||
|
$id_privatesales = (int)Tools::getValue('id_privatesales');
|
||
|
$urlcurrent = __PS_BASE_URI__.'modules/privatesales/img/'.$id_privatesales.'/current/'.$id_privatesales ;
|
||
|
$urlfuture = __PS_BASE_URI__.'modules/privatesales/img/'.$id_privatesales.'/future/'.$id_privatesales ;
|
||
|
$urlpast = __PS_BASE_URI__.'modules/privatesales/img/'.$id_privatesales.'/past/'.$id_privatesales ;
|
||
|
$urltrailer = __PS_BASE_URI__.'modules/privatesales/img/'.$id_privatesales.'/trailer/'.$id_privatesales ;
|
||
|
$urlnewsletter = __PS_BASE_URI__.'modules/privatesales/img/'.$id_privatesales.'/newsletter/'.$id_privatesales ;
|
||
|
$urlnewsletter_new = __PS_BASE_URI__.'modules/privatesales/img/'.$id_privatesales.'/newsletter_new/'.$id_privatesales ;
|
||
|
$urllogo = __PS_BASE_URI__.'modules/privatesales/img/'.$id_privatesales.'/logo/'.$id_privatesales ;
|
||
|
$urlflashsale = __PS_BASE_URI__.'modules/privatesales/img/'.$id_privatesales.'/flashsale/'.$id_privatesales ;
|
||
|
$urlhotspot = __PS_BASE_URI__.'modules/privatesales/img/'.$id_privatesales.'/hotspot/'.$id_privatesales ;
|
||
|
}else{
|
||
|
$urlcurrent = "noimg" ;
|
||
|
$urlfuture = "noimg" ;
|
||
|
$urlpast = "noimg" ;
|
||
|
$urltrailer = "noimg" ;
|
||
|
$urlnewsletter = "noimg" ;
|
||
|
$urlnewsletter_new = "noimg" ;
|
||
|
$urllogo = "noimg" ;
|
||
|
$urlflashsale = "noimg" ;
|
||
|
$urlhotspot = "noimg" ;
|
||
|
}
|
||
|
|
||
|
$groups = Group::getGroups($this->default_form_language, true);
|
||
|
|
||
|
$brands = array();
|
||
|
$sale_brands = (!$this->object->id_privatesales? array(): $this->object->getBrands());
|
||
|
foreach(Manufacturer::getManufacturers() as $m) {
|
||
|
$m['selected'] = (bool) in_array($m['id_manufacturer'], $sale_brands);
|
||
|
$brands[] = $m;
|
||
|
}
|
||
|
|
||
|
$salescategory = array();
|
||
|
$sale_privatesales = (!$this->object->id_privatesales? array(): $this->object->getSalesCategory());
|
||
|
foreach(SaleCategory::getCategoryTab((int) $this->context->cookie->id_lang, FALSE) as $m) {
|
||
|
$m['selected'] = (bool) in_array($m['id_privatesales_category'], $sale_privatesales);
|
||
|
$salescategory[] = $m;
|
||
|
}
|
||
|
|
||
|
$this->fields_form = array(
|
||
|
'multilang' => true,
|
||
|
'tinymce' => true,
|
||
|
'legend' => array(
|
||
|
'title' => $this->l('Sale'),
|
||
|
),
|
||
|
'submit' => array(
|
||
|
'name' => 'submitSale',
|
||
|
'title' => $this->l('Save'),
|
||
|
),
|
||
|
'input' => array(
|
||
|
array(
|
||
|
'type' => 'text',
|
||
|
'label' => $this->l('Name'),
|
||
|
'name' => 'title',
|
||
|
'lang' => true,
|
||
|
'required' => true,
|
||
|
'form_group_class' => 'fieldhide input_info',
|
||
|
'size' => 255
|
||
|
),
|
||
|
array(
|
||
|
'type' => 'text',
|
||
|
'label' => $this->l('Subtitle'),
|
||
|
'name' => 'subtitle',
|
||
|
'lang' => true,
|
||
|
'form_group_class' => 'fieldhide input_info',
|
||
|
'size' => 255
|
||
|
),
|
||
|
array(
|
||
|
'type' => 'datetime',
|
||
|
'label' => $this->l('Date Start'),
|
||
|
'name' => 'date_start',
|
||
|
'form_group_class' => 'fieldhide input_dates',
|
||
|
'required' => true,
|
||
|
'size' => 33,
|
||
|
),
|
||
|
array(
|
||
|
'type' => 'datetime',
|
||
|
'label' => $this->l('Date End'),
|
||
|
'name' => 'date_end',
|
||
|
'form_group_class' => 'fieldhide input_dates',
|
||
|
'required' => true,
|
||
|
'size' => 33,
|
||
|
),
|
||
|
array(
|
||
|
'type' => 'datetime',
|
||
|
'label' => $this->l('Date Start Hotspot'),
|
||
|
'name' => 'date_start_hotspot',
|
||
|
'form_group_class' => 'fieldhide input_dates',
|
||
|
'size' => 33,
|
||
|
),
|
||
|
array(
|
||
|
'type' => 'datetime',
|
||
|
'label' => $this->l('Date End Hotspot'),
|
||
|
'name' => 'date_end_hotspot',
|
||
|
'form_group_class' => 'fieldhide input_dates',
|
||
|
'size' => 33,
|
||
|
),
|
||
|
array(
|
||
|
'type' => 'date',
|
||
|
'label' => $this->l('Date Shipping'),
|
||
|
'name' => 'date_shipping',
|
||
|
'form_group_class' => 'fieldhide input_dates',
|
||
|
'required' => true,
|
||
|
'size' => 33,
|
||
|
),
|
||
|
array(
|
||
|
'type' => 'textarea',
|
||
|
'label' => $this->l('Description'),
|
||
|
'desc' => $this->l('Limit to 160 Characters.'),
|
||
|
'name' => 'description',
|
||
|
'form_group_class' => 'fieldhide input_info',
|
||
|
'lang' => true,
|
||
|
'cols' => 60,
|
||
|
'rows' => 60
|
||
|
),
|
||
|
array(
|
||
|
'type' => 'text',
|
||
|
'label' => $this->l('Percent'),
|
||
|
'name' => 'percent',
|
||
|
'form_group_class' => 'fieldhide input_info',
|
||
|
'size' => 255
|
||
|
),
|
||
|
array(
|
||
|
'type' => 'file',
|
||
|
'label' => $this->l('Select an image for logo'),
|
||
|
'name' => 'imagelogo',
|
||
|
'form_group_class' => 'fieldhide input_img',
|
||
|
'url' => $urllogo
|
||
|
),
|
||
|
array(
|
||
|
'type' => 'file',
|
||
|
'label' => $this->l('Select an image for current'),
|
||
|
'name' => 'imagecurrent',
|
||
|
'form_group_class' => 'fieldhide input_img',
|
||
|
'url' => $urlcurrent
|
||
|
),
|
||
|
array(
|
||
|
'type' => 'switch',
|
||
|
'label' => $this->l('Sale Flash'),
|
||
|
'name' => 'flash',
|
||
|
'required' => false,
|
||
|
'class' => 't',
|
||
|
'form_group_class' => 'fieldhide input_info',
|
||
|
'is_bool' => true,
|
||
|
'values' => array(
|
||
|
array(
|
||
|
'id' => 'flash_on',
|
||
|
'value' => 1
|
||
|
),
|
||
|
array(
|
||
|
'id' => 'flash_off',
|
||
|
'value' => 0
|
||
|
)
|
||
|
),
|
||
|
),
|
||
|
array(
|
||
|
'type' => 'switch',
|
||
|
'label' => $this->l('Sale News'),
|
||
|
'name' => 'news',
|
||
|
'required' => false,
|
||
|
'class' => 't',
|
||
|
'form_group_class' => 'fieldhide input_info',
|
||
|
'is_bool' => true,
|
||
|
'values' => array(
|
||
|
array(
|
||
|
'id' => 'news_on',
|
||
|
'value' => 1
|
||
|
),
|
||
|
array(
|
||
|
'id' => 'news_off',
|
||
|
'value' => 0
|
||
|
)
|
||
|
),
|
||
|
),
|
||
|
array(
|
||
|
'type' => 'switch',
|
||
|
'label' => $this->l('Univers'),
|
||
|
'name' => 'univers',
|
||
|
'required' => false,
|
||
|
'class' => 't',
|
||
|
'form_group_class' => 'fieldhide input_info',
|
||
|
'is_bool' => true,
|
||
|
'values' => array(
|
||
|
array(
|
||
|
'id' => 'univers_on',
|
||
|
'value' => 1
|
||
|
),
|
||
|
array(
|
||
|
'id' => 'univers_off',
|
||
|
'value' => 0
|
||
|
)
|
||
|
),
|
||
|
),
|
||
|
array(
|
||
|
'type' => 'switch',
|
||
|
'label' => $this->l('Enabled'),
|
||
|
'name' => 'active',
|
||
|
'required' => false,
|
||
|
'class' => 't',
|
||
|
'form_group_class' => 'fieldhide input_info',
|
||
|
'is_bool' => true,
|
||
|
'values' => array(
|
||
|
array(
|
||
|
'id' => 'active_on',
|
||
|
'value' => 1
|
||
|
),
|
||
|
array(
|
||
|
'id' => 'active_off',
|
||
|
'value' => 0
|
||
|
)
|
||
|
),
|
||
|
),
|
||
|
array(
|
||
|
'type' => 'switch',
|
||
|
'label' => $this->l('Archived'),
|
||
|
'name' => 'archived',
|
||
|
'required' => false,
|
||
|
'class' => 't',
|
||
|
'form_group_class' => 'fieldhide input_info',
|
||
|
'is_bool' => true,
|
||
|
'values' => array(
|
||
|
array(
|
||
|
'id' => 'archived_on',
|
||
|
'value' => 1
|
||
|
),
|
||
|
array(
|
||
|
'id' => 'archived_off',
|
||
|
'value' => 0
|
||
|
)
|
||
|
),
|
||
|
),
|
||
|
array(
|
||
|
'type' => 'select',
|
||
|
'label' => $this->l('Category'),
|
||
|
'name' => 'id_category',
|
||
|
'required' => true,
|
||
|
'form_group_class' => 'fieldhide input_association',
|
||
|
'options' => array(
|
||
|
'query' => $categories,
|
||
|
'id' => 'id',
|
||
|
'name' => 'name'
|
||
|
)
|
||
|
),
|
||
|
array(
|
||
|
'type' => 'group',
|
||
|
'label' => $this->l('Group access'),
|
||
|
'name' => 'groupBox',
|
||
|
'form_group_class' => 'fieldhide input_association',
|
||
|
'values' => $groups,
|
||
|
'col' => '6',
|
||
|
),
|
||
|
array(
|
||
|
'type' => 'brand',
|
||
|
'label' => $this->l('Brand'),
|
||
|
'name' => 'brandBox',
|
||
|
'form_group_class' => 'fieldhide input_association',
|
||
|
'values' => $brands,
|
||
|
'col' => '6',
|
||
|
),
|
||
|
array(
|
||
|
'type' => 'salescategory',
|
||
|
'label' => $this->l('Sales Category'),
|
||
|
'name' => 'categoryBox',
|
||
|
'form_group_class' => 'fieldhide input_association',
|
||
|
'values' => $salescategory,
|
||
|
'col' => '6',
|
||
|
),
|
||
|
array(
|
||
|
'type' => 'shop',
|
||
|
'label' => $this->l('Shop'),
|
||
|
'form_group_class' => 'fieldhide input_association',
|
||
|
'name' => 'checkBoxShopSale'
|
||
|
)
|
||
|
)
|
||
|
);
|
||
|
if(Configuration::get('PRIVATESALES_FUTURESALES')){
|
||
|
$this->fields_form['input'][] = array(
|
||
|
'type' => 'file',
|
||
|
'label' => $this->l('Select an image for future'),
|
||
|
'name' => 'imagefuture',
|
||
|
'form_group_class' => 'fieldhide input_img',
|
||
|
'url' => $urlfuture
|
||
|
);
|
||
|
}
|
||
|
if(Configuration::get('PRIVATESALES_PASTSALES')){
|
||
|
$this->fields_form['input'][] =
|
||
|
array(
|
||
|
'type' => 'file',
|
||
|
'label' => $this->l('Select an image for past'),
|
||
|
'name' => 'imagepast',
|
||
|
'form_group_class' => 'fieldhide input_img',
|
||
|
'url' => $urlpast
|
||
|
);
|
||
|
}
|
||
|
if(Configuration::get('PRIVATESALES_HOTSPOT')){
|
||
|
$this->fields_form['input'][] =
|
||
|
array(
|
||
|
'type' => 'file',
|
||
|
'label' => $this->l('Select an image for hotspot'),
|
||
|
'name' => 'imagehotspot',
|
||
|
'form_group_class' => 'fieldhide input_img',
|
||
|
'url' => $urlhotspot
|
||
|
);
|
||
|
}
|
||
|
if(Configuration::get('PRIVATESALES_FLASH')){
|
||
|
$this->fields_form['input'][] =
|
||
|
array(
|
||
|
'type' => 'file',
|
||
|
'label' => $this->l('Select an image for flashsale'),
|
||
|
'name' => 'imageflashsale',
|
||
|
'form_group_class' => 'fieldhide input_img',
|
||
|
'url' => $urlflashsale
|
||
|
);
|
||
|
}
|
||
|
$this->fields_form['input'][] = array(
|
||
|
'type' => 'file',
|
||
|
'label' => $this->l('Select an image for trailer'),
|
||
|
'name' => 'imagetrailer',
|
||
|
'form_group_class' => 'fieldhide input_img',
|
||
|
'url' => $urltrailer
|
||
|
);
|
||
|
$this->fields_form['input'][] = array(
|
||
|
'type' => 'file',
|
||
|
'label' => $this->l('Image pour la newsletter (nouvelles ventes)'),
|
||
|
'name' => 'imagenewsletter_new',
|
||
|
'form_group_class' => 'fieldhide input_newsletter',
|
||
|
'url' => $urlnewsletter_new
|
||
|
);
|
||
|
$this->fields_form['input'][] = array(
|
||
|
'type' => 'file',
|
||
|
'label' => $this->l('Image pour la newsletter (vente en cours)'),
|
||
|
'name' => 'imagenewsletter',
|
||
|
'form_group_class' => 'fieldhide input_newsletter',
|
||
|
'url' => $urlnewsletter
|
||
|
);
|
||
|
$this->fields_form['input'][] = array(
|
||
|
'type' => 'textarea',
|
||
|
'label' => $this->l('Description sur la newsletter'),
|
||
|
'name' => 'description_newsletter',
|
||
|
'form_group_class' => 'fieldhide input_newsletter',
|
||
|
'lang' => true,
|
||
|
'cols' => 60,
|
||
|
'rows' => 60
|
||
|
);
|
||
|
|
||
|
// Added values of object Group
|
||
|
if (!Validate::isUnsignedId($obj->id))
|
||
|
$privatesales_groups = array();
|
||
|
else
|
||
|
$privatesales_groups = $obj->getGroups();
|
||
|
$privatesales_groups_ids = array();
|
||
|
if (is_array($privatesales_groups))
|
||
|
foreach ($privatesales_groups as $privatesales_group)
|
||
|
$privatesales_groups_ids[] = $privatesales_group;
|
||
|
|
||
|
foreach ($groups as $group)
|
||
|
$this->fields_value['groupBox_'.$group['id_group']] =
|
||
|
Tools::getValue('groupBox_'.$group['id_group'], in_array($group['id_group'], $privatesales_groups_ids));
|
||
|
|
||
|
$this->extraForms();
|
||
|
$this->extraForms2();
|
||
|
$this->extraForms3();
|
||
|
$this->extraForms4();
|
||
|
|
||
|
return parent::renderForm();
|
||
|
}
|
||
|
|
||
|
public function extraForms()
|
||
|
{
|
||
|
$this->fields_form['input'][] = array(
|
||
|
'type' => 'switch',
|
||
|
'label' => $this->l('Jeu concours'),
|
||
|
'name' => 'concours',
|
||
|
'required' => false,
|
||
|
'class' => 't',
|
||
|
'form_group_class' => 'fieldhide input_extra',
|
||
|
'is_bool' => true,
|
||
|
'values' => array(
|
||
|
array(
|
||
|
'id' => 'concours_on',
|
||
|
'value' => 1
|
||
|
),
|
||
|
array(
|
||
|
'id' => 'concours_off',
|
||
|
'value' => 0
|
||
|
)
|
||
|
)
|
||
|
);
|
||
|
|
||
|
$this->fields_form['input'][] = array(
|
||
|
'type' => 'text',
|
||
|
'label' => $this->l('Durée jeu concours'),
|
||
|
'name' => 'concours_delay',
|
||
|
'required' => false,
|
||
|
'class' => 't',
|
||
|
'form_group_class' => 'fieldhide input_extra',
|
||
|
);
|
||
|
|
||
|
}
|
||
|
|
||
|
public function extraForms2()
|
||
|
{
|
||
|
$this->fields_form['input'][] = array(
|
||
|
'type' => 'switch',
|
||
|
'label' => $this->l('Picto'),
|
||
|
'name' => 'picto',
|
||
|
'required' => false,
|
||
|
'class' => 't',
|
||
|
'form_group_class' => 'fieldhide input_extra2',
|
||
|
'is_bool' => true,
|
||
|
'values' => array(
|
||
|
array(
|
||
|
'id' => 'picto_on',
|
||
|
'value' => 1
|
||
|
),
|
||
|
array(
|
||
|
'id' => 'picto_off',
|
||
|
'value' => 0
|
||
|
)
|
||
|
)
|
||
|
);
|
||
|
$this->fields_form['input'][] = array(
|
||
|
'type' => 'switch',
|
||
|
'label' => $this->l('Picto Catégorie'),
|
||
|
'name' => 'picto_category',
|
||
|
'required' => false,
|
||
|
'class' => 't',
|
||
|
'form_group_class' => 'fieldhide input_extra2',
|
||
|
'is_bool' => true,
|
||
|
'values' => array(
|
||
|
array(
|
||
|
'id' => 'picto_category_on',
|
||
|
'value' => 1
|
||
|
),
|
||
|
array(
|
||
|
'id' => 'picto_category_off',
|
||
|
'value' => 0
|
||
|
)
|
||
|
)
|
||
|
);
|
||
|
|
||
|
}
|
||
|
|
||
|
public function extraForms3()
|
||
|
{
|
||
|
$this->fields_form['input'][] = array(
|
||
|
'type' => 'switch',
|
||
|
'label' => $this->l('Autre delai de livraison'),
|
||
|
'name' => 'otherdelay',
|
||
|
'required' => false,
|
||
|
'class' => 't',
|
||
|
'form_group_class' => 'fieldhide input_extra3',
|
||
|
'is_bool' => true,
|
||
|
'values' => array(
|
||
|
array(
|
||
|
'id' => 'otherdelay_on',
|
||
|
'value' => 1
|
||
|
),
|
||
|
array(
|
||
|
'id' => 'otherdelay_off',
|
||
|
'value' => 0
|
||
|
)
|
||
|
)
|
||
|
);
|
||
|
|
||
|
$this->fields_form['input'][] = array(
|
||
|
'type' => 'text',
|
||
|
'label' => $this->l('Durée de livraison'),
|
||
|
'name' => 'otherdelay_title',
|
||
|
'lang' => true,
|
||
|
'size' => 255,
|
||
|
'required' => false,
|
||
|
'class' => 't',
|
||
|
'form_group_class' => 'fieldhide input_extra3',
|
||
|
);
|
||
|
}
|
||
|
|
||
|
public function extraForms4()
|
||
|
{
|
||
|
$this->fields_form['input'][] = array(
|
||
|
'type' => 'switch',
|
||
|
'label' => $this->l('Activer extratab'),
|
||
|
'name' => 'extratab',
|
||
|
'required' => false,
|
||
|
'class' => 't',
|
||
|
'form_group_class' => 'fieldhide input_extra4',
|
||
|
'is_bool' => true,
|
||
|
'values' => array(
|
||
|
array(
|
||
|
'id' => 'extratab_on',
|
||
|
'value' => 1
|
||
|
),
|
||
|
array(
|
||
|
'id' => 'extratab_off',
|
||
|
'value' => 0
|
||
|
)
|
||
|
)
|
||
|
);
|
||
|
|
||
|
$this->fields_form['input'][] = array(
|
||
|
'type' => 'text',
|
||
|
'label' => $this->l('Titre'),
|
||
|
'name' => 'extratab_title',
|
||
|
'lang' => true,
|
||
|
'size' => 255,
|
||
|
'required' => false,
|
||
|
'class' => 't',
|
||
|
'form_group_class' => 'fieldhide input_extra4',
|
||
|
);
|
||
|
|
||
|
$this->fields_form['input'][] = array(
|
||
|
'type' => 'textarea',
|
||
|
'label' => $this->l('Description'),
|
||
|
'name' => 'extratab_text',
|
||
|
'lang' => true,
|
||
|
'tinymce' => true,
|
||
|
'required' => false,
|
||
|
'autoload_rte' => true,
|
||
|
'cols' => 40,
|
||
|
'rows' => 6,
|
||
|
'class' => 't',
|
||
|
'form_group_class' => 'fieldhide input_extra4',
|
||
|
);
|
||
|
}
|
||
|
|
||
|
public function init() {
|
||
|
parent::init();
|
||
|
|
||
|
if(Tools::isSubmit('archivedprivatesales') && Tools::getValue('id_privatesales')){
|
||
|
$object = new SaleCore((int)Tools::getValue('id_privatesales'));
|
||
|
if( $object->archived == 0){
|
||
|
$object->archived = 1;
|
||
|
}else{
|
||
|
$object->archived = 0;
|
||
|
}
|
||
|
$object->update();
|
||
|
}
|
||
|
|
||
|
if(Tools::isSubmit('flashprivatesales') && Tools::getValue('id_privatesales')){
|
||
|
$object = new SaleCore((int)Tools::getValue('id_privatesales'));
|
||
|
if( $object->flash == 0){
|
||
|
$object->flash = 1;
|
||
|
}else{
|
||
|
$object->flash = 0;
|
||
|
}
|
||
|
$object->update();
|
||
|
}
|
||
|
|
||
|
if(Tools::isSubmit('newsprivatesales') && Tools::getValue('id_privatesales')){
|
||
|
$object = new SaleCore((int)Tools::getValue('id_privatesales'));
|
||
|
if( $object->news == 0){
|
||
|
$object->news = 1;
|
||
|
}else{
|
||
|
$object->news = 0;
|
||
|
}
|
||
|
$object->update();
|
||
|
}
|
||
|
if(Tools::isSubmit('concoursprivatesales') && Tools::getValue('id_privatesales')){
|
||
|
$object = new SaleCore((int)Tools::getValue('id_privatesales'));
|
||
|
if( $object->concours == 0){
|
||
|
$object->concours = 1;
|
||
|
}else{
|
||
|
$object->concours = 0;
|
||
|
}
|
||
|
$object->update();
|
||
|
}
|
||
|
|
||
|
if(Tools::isSubmit('pictoprivatesales') && Tools::getValue('id_privatesales')){
|
||
|
$object = new SaleCore((int)Tools::getValue('id_privatesales'));
|
||
|
if( $object->picto == 0){
|
||
|
$object->picto = 1;
|
||
|
}else{
|
||
|
$object->picto = 0;
|
||
|
}
|
||
|
$object->update();
|
||
|
}
|
||
|
|
||
|
if(Tools::isSubmit('extratabprivatesales') && Tools::getValue('id_privatesales')){
|
||
|
$object = new SaleCore((int)Tools::getValue('id_privatesales'));
|
||
|
if( $object->extratab == 0){
|
||
|
$object->extratab = 1;
|
||
|
}else{
|
||
|
$object->extratab = 0;
|
||
|
}
|
||
|
$object->update();
|
||
|
}
|
||
|
|
||
|
if(Tools::isSubmit('otherdelayprivatesales') && Tools::getValue('id_privatesales')){
|
||
|
$object = new SaleCore((int)Tools::getValue('id_privatesales'));
|
||
|
if( $object->otherdelay == 0){
|
||
|
$object->otherdelay = 1;
|
||
|
}else{
|
||
|
$object->otherdelay = 0;
|
||
|
}
|
||
|
$object->update();
|
||
|
}
|
||
|
|
||
|
if(Tools::isSubmit('duplicateprivatesales') && Tools::getValue('id_privatesales')){
|
||
|
$this->processDuplicate();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
*
|
||
|
*/
|
||
|
public static function getCategoryName($id,$obj) {
|
||
|
$context = Context::getContext();
|
||
|
$category = new Category($id,$context->language->id,$context->shop->id);
|
||
|
return $category->name;
|
||
|
}
|
||
|
|
||
|
protected function copyFromPost(&$object, $table){
|
||
|
parent::copyFromPost($object, $table);
|
||
|
if(Shop::isFeatureActive())
|
||
|
{
|
||
|
// Build id_shop_list with checkBoxShopSale
|
||
|
$object->id_shop_list = array();
|
||
|
foreach (Tools::getValue('checkBoxShopSale') as $id_shop => $value)
|
||
|
$object->id_shop_list[] = $id_shop;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
public function processSave()
|
||
|
{
|
||
|
$datetime_start = new DateTime(Tools::getValue('date_start'));
|
||
|
$datetime_end = new DateTime(Tools::getValue('date_end'));
|
||
|
$datetime_shipping = new DateTime(Tools::getValue('date_shipping'));
|
||
|
|
||
|
if ($datetime_start > $datetime_end || $datetime_shipping < $datetime_end) {
|
||
|
$this->errors[] = sprintf(Tools::displayError('Les dates ne sont pas cohérentes'));
|
||
|
}
|
||
|
|
||
|
$save = parent::processSave();
|
||
|
|
||
|
if(Validate::isLoadedObject($this->object)){
|
||
|
$languages = Language::getLanguages(false);
|
||
|
foreach ($languages as $language) {
|
||
|
if(Validate::isLoadedObject($this->object)){
|
||
|
|
||
|
$tabimgs = array(
|
||
|
"current",
|
||
|
"hotspot",
|
||
|
"future",
|
||
|
"past",
|
||
|
"trailer",
|
||
|
"newsletter",
|
||
|
"newsletter_new",
|
||
|
"logo",
|
||
|
"flashsale",
|
||
|
);
|
||
|
|
||
|
foreach($tabimgs as $tabimg){
|
||
|
$namePost = 'image'.$tabimg.'_'.$language['id_lang'];
|
||
|
if(isset($_FILES[$namePost]) && !empty($_FILES[$namePost]['tmp_name']) ){
|
||
|
$fileTemp = $_FILES[$namePost]['tmp_name'];
|
||
|
$fileParts = pathinfo($_FILES[$namePost]['name']);
|
||
|
if($fileParts['extension'] == 'jpg' || $fileParts['extension'] == 'png'){
|
||
|
if(!is_dir(_PS_MODULE_DIR_.'privatesales/img/'. $this->object->id)) {
|
||
|
mkdir(_PS_MODULE_DIR_.'privatesales/img/'. $this->object->id, 0775);
|
||
|
}
|
||
|
if(!is_dir(_PS_MODULE_DIR_.'privatesales/img/'. $this->object->id . '/'.$tabimg)) {
|
||
|
mkdir(_PS_MODULE_DIR_.'privatesales/img/'. $this->object->id. '/'.$tabimg, 0775);
|
||
|
}
|
||
|
|
||
|
$res = move_uploaded_file($fileTemp, _PS_MODULE_DIR_.'privatesales/img/'. $this->object->id . '/'.$tabimg.'/'. $this->object->id . '_'.$language['id_lang'].'.jpg');
|
||
|
if(!$res)
|
||
|
$this->errors[] = sprintf(Tools::displayError('An error occured during upload of file %s'), $this->object->id . '.jpg');
|
||
|
else
|
||
|
$this->confirmations[] = sprintf($this->l('File %s has been uploaded'), $this->object->id . '.jpg');
|
||
|
} else
|
||
|
$this->errors[] = sprintf(Tools::displayError('File %s have not good extension, only .jpg or .png'), $this->object->id . '.jpg');
|
||
|
}
|
||
|
}
|
||
|
|
||
|
}
|
||
|
}
|
||
|
|
||
|
Db::getInstance()->execute('
|
||
|
DELETE FROM `'._DB_PREFIX_.'privatesales_group`
|
||
|
WHERE `id_privatesales` = '.(int) $this->object->id.'
|
||
|
');
|
||
|
|
||
|
foreach(Tools::getValue('groupBox', array()) as $group) {
|
||
|
Db::getInstance()->execute('
|
||
|
INSERT INTO `'._DB_PREFIX_.'privatesales_group`
|
||
|
VALUES (
|
||
|
'.(int) $this->object->id.',
|
||
|
'.(int) $group.'
|
||
|
)
|
||
|
');
|
||
|
}
|
||
|
|
||
|
Db::getInstance()->execute('
|
||
|
DELETE FROM `'._DB_PREFIX_.'privatesales_brand`
|
||
|
WHERE `id_privatesales` = '.(int) $this->object->id.'
|
||
|
');
|
||
|
|
||
|
foreach(Tools::getValue('brandBox', array()) as $brand) {
|
||
|
Db::getInstance()->execute('
|
||
|
INSERT INTO `'._DB_PREFIX_.'privatesales_brand`
|
||
|
VALUES (
|
||
|
'.(int) $this->object->id.',
|
||
|
'.(int) $brand.'
|
||
|
)
|
||
|
');
|
||
|
}
|
||
|
|
||
|
Db::getInstance()->execute('
|
||
|
DELETE FROM `'._DB_PREFIX_.'privatesales_category_sales`
|
||
|
WHERE `id_privatesales` = '.(int) $this->object->id.'
|
||
|
');
|
||
|
|
||
|
foreach(Tools::getValue('categoryBox', array()) as $category) {
|
||
|
Db::getInstance()->execute('
|
||
|
INSERT INTO `'._DB_PREFIX_.'privatesales_category_sales`
|
||
|
VALUES (
|
||
|
'.(int) $category.',
|
||
|
'.(int) $this->object->id.'
|
||
|
)
|
||
|
');
|
||
|
}
|
||
|
}
|
||
|
return $save;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Overrides parent for custom redirect link
|
||
|
*/
|
||
|
public function processPosition()
|
||
|
{
|
||
|
if (!Validate::isLoadedObject($object = $this->loadObject()))
|
||
|
{
|
||
|
$this->errors[] = Tools::displayError('An error occurred while updating the status for an object.').
|
||
|
' <b>'.$this->table.'</b> '.Tools::displayError('(cannot load object)');
|
||
|
}
|
||
|
elseif (!$object->updatePosition((int)Tools::getValue('way'), (int)Tools::getValue('position')))
|
||
|
$this->errors[] = Tools::displayError('Failed to update the position.');
|
||
|
else
|
||
|
{
|
||
|
$privatesales = new SaleCore((int)Tools::getValue('id_privatesales'));
|
||
|
$this->redirect_after = self::$currentIndex.'&listby=current&'.$this->table.'Orderby=position&'.$this->table.'Orderway=asc&action=Customization&conf=5'.(($id_privatesales = (Tools::getIsset('id_privatesales') ? (int)Tools::getValue('id_privatesales') : '')) ? ('&id_privatesales='.$id_privatesales) : '').'&token='.Tools::getAdminTokenLite('AdminPrivateSales');
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public function processDuplicate()
|
||
|
{
|
||
|
echo "ok";
|
||
|
if (Validate::isLoadedObject($privatesales = new SaleCore((int)Tools::getValue('id_privatesales'))))
|
||
|
{
|
||
|
$id_privatesales_old = $privatesales->id;
|
||
|
unset($privatesales->id);
|
||
|
unset($privatesales->id_privatesales);
|
||
|
$privatesales->active = 0;
|
||
|
$privatesales->add();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public function ajaxProcessUpdatePositions()
|
||
|
{
|
||
|
$way = (int)(Tools::getValue('way'));
|
||
|
$id_privatesales = (int)(Tools::getValue('id'));
|
||
|
$positions = Tools::getValue('privatesales');
|
||
|
|
||
|
if (is_array($positions))
|
||
|
foreach ($positions as $position => $value)
|
||
|
{
|
||
|
$pos = explode('_', $value);
|
||
|
|
||
|
if (isset($pos[2]) && (int)$pos[2] === $id_privatesales)
|
||
|
{
|
||
|
if ($privatesales = new SaleCore((int)$pos[2]))
|
||
|
if (isset($position) && $privatesales->updatePosition($way, $position+1))
|
||
|
{
|
||
|
echo 'ok position '.(int)$position.' for privatesales '.(int)$pos[2]."\r\n";
|
||
|
}
|
||
|
else
|
||
|
echo '{"hasError" : true, "errors" : "Can not update privatesales '.(int)$id_privatesales.' to position '.(int)$position.' "}';
|
||
|
else
|
||
|
echo '{"hasError" : true, "errors" : "This privatesales ('.(int)$id_privatesales.') can t be loaded"}';
|
||
|
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/*** HACK TRADUCTION ***/
|
||
|
|
||
|
public static $l_cache;
|
||
|
|
||
|
protected function l($string, $class = 'AdminTab', $addslashes = FALSE, $htmlentities = TRUE)
|
||
|
{
|
||
|
// need to be called in order to populate $classInModule
|
||
|
$str = self::findTranslation('privatesales', $string, 'AdminPrivateSales');
|
||
|
$str = $htmlentities ? htmlentities($str, ENT_QUOTES, 'utf-8') : $str;
|
||
|
return str_replace('"', '"', ($addslashes ? addslashes($str) : stripslashes($str)));
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* findTranslation (initially in Module class), to make translations works
|
||
|
*
|
||
|
* @param string $name module name
|
||
|
* @param string $string string to translate
|
||
|
* @param string $source current class
|
||
|
* @return string translated string
|
||
|
*/
|
||
|
public static function findTranslation($name, $string, $source)
|
||
|
{
|
||
|
static $_MODULES;
|
||
|
if (!is_array($_MODULES))
|
||
|
{
|
||
|
// note: $_COOKIE[iso_code] is set in createCustomToken();
|
||
|
$file = _PS_MODULE_DIR_.'privatesales/translations/'.Configuration::get('PS_LOCALE_LANGUAGE').'.php';
|
||
|
if (file_exists($file) && include($file))
|
||
|
$_MODULES = !empty($_MODULES)?array_merge($_MODULES, $_MODULE):$_MODULE;
|
||
|
}
|
||
|
$cache_key = $name.'|'.$string.'|'.$source;
|
||
|
|
||
|
if (!isset(self::$l_cache[$cache_key]))
|
||
|
{
|
||
|
if (!is_array($_MODULES))
|
||
|
return $string;
|
||
|
// set array key to lowercase for 1.3 compatibility
|
||
|
$_MODULES = array_change_key_case($_MODULES);
|
||
|
if (defined('_THEME_NAME_'))
|
||
|
$currentKey = '<{'.strtolower($name).'}'.strtolower(_THEME_NAME_).'>'.strtolower($source).'_'.md5($string);
|
||
|
else
|
||
|
$currentKey = '<{'.strtolower($name).'}default>'.strtolower($source).'_'.md5($string);
|
||
|
// note : we should use a variable to define the default theme (instead of "prestashop")
|
||
|
$defaultKey = '<{'.strtolower($name).'}prestashop>'.strtolower($source).'_'.md5($string);
|
||
|
$currentKey = $defaultKey;
|
||
|
|
||
|
if (isset($_MODULES[$currentKey]))
|
||
|
$ret = stripslashes($_MODULES[$currentKey]);
|
||
|
elseif (isset($_MODULES[strtolower($currentKey)]))
|
||
|
$ret = stripslashes($_MODULES[strtolower($currentKey)]);
|
||
|
elseif (isset($_MODULES[$defaultKey]))
|
||
|
$ret = stripslashes($_MODULES[$defaultKey]);
|
||
|
elseif (isset($_MODULES[strtolower($defaultKey)]))
|
||
|
$ret = stripslashes($_MODULES[strtolower($defaultKey)]);
|
||
|
else
|
||
|
$ret = stripslashes($string);
|
||
|
|
||
|
self::$l_cache[$cache_key] = $ret;
|
||
|
}
|
||
|
return self::$l_cache[$cache_key];
|
||
|
}
|
||
|
}
|