name = 'privatesales'; $this->tab = 'pricing_promotion'; $this->version = '1'; $this->author = 'Antadis'; $this->need_instance = 0; parent::__construct(); $this->displayName = $this->l('Private Sales Pro'); $this->description = $this->l('Private sales management for your online shop'); $this->confirmUninstall = $this->l('Are you sure you want to delete Private Sales Pro?'); } /***********************/ /******* Install *******/ /***********************/ /** * * @return boolean */ public function install() { $this->createTab(); if ( !parent::install() || !$this->installDb() || !$this->registerHook('displayHeader') || !$this->registerHook('displayHomeTab') || !$this->registerHook('displayBackOfficeHeader') || !$this->registerHook('RightColumn') || !$this->registerHook('LeftColumn') || !$this->registerHook('DisplayTopColumn') || !$this->registerHook('ModuleRoutes') || !$this->registerHook('displayCategoryFooter') ){ $this->uninstall(); $this->deleteTab(); $this->uninstallDb(); return false; } Configuration::updateValue('PRIVATESALES_ROOT', 0); Configuration::updateValue('PRIVATESALES_POPUP_CONNECTION', 0); Configuration::updateValue('PRIVATESALES_FUTURELIMIT', 30); Configuration::updateValue('PRIVATESALES_PASTLIMIT', 30); Configuration::updateValue('PRIVATESALES_SEO_FR', 'ventes-privees'); Configuration::updateValue('PRIVATESALES_SEO_EN', 'privates-sales'); Configuration::updateValue('PRIVATESALES_SEOTRAILER_FR', 'bande-annonce'); Configuration::updateValue('PRIVATESALES_SEOTRAILER_EN', 'teaser'); Configuration::updateValue('PRIVATESALES_LISTING_PUBLIC', 0); Configuration::updateValue('PRIVATESALES_HOTSPOT', 1); Configuration::updateValue('PRIVATESALES_FLASH', 0); Configuration::updateValue('PRIVATESALES_PASTSALES', 1); Configuration::updateValue('PRIVATESALES_FUTURESALES', 1); Configuration::updateValue('PRIVATESALES_SAME_CATEGORY', 0); Configuration::updateValue('PRIVATESALES_SAME_CATEGORY_NUMBER', 3); Configuration::updateValue('PRIVATESALES_SHOWHOME', 0); Configuration::updateValue('PRIVATESALES_COLUMN', 0); Configuration::updateValue('PRIVATESALES_TRAILER_COLUMN', 0); Configuration::updateValue('PRIVATESALES_SEND_ALERT_LIMIT', 1440); return true; } /** * * @return boolean */ public function uninstall() { if( !parent::uninstall() ){ return false; } $this->deleteTab(); $this->uninstallDb(); Configuration::deleteByName('PRIVATESALES_FUTURELIMIT'); Configuration::deleteByName('PRIVATESALES_PASTLIMIT'); Configuration::deleteByName('PRIVATESALES_ROOT'); Configuration::deleteByName('PRIVATESALES_POPUP_CONNECTION'); Configuration::deleteByName('PRIVATESALES_SEO_FR'); Configuration::deleteByName('PRIVATESALES_SEO_EN'); Configuration::deleteByName('PRIVATESALES_SEOTRAILER_FR'); Configuration::deleteByName('PRIVATESALES_SEOTRAILER_EN'); Configuration::deleteByName('PRIVATESALES_LISTING_PUBLIC'); Configuration::deleteByName('PRIVATESALES_HOTSPOT'); Configuration::deleteByName('PRIVATESALES_FLASH'); Configuration::deleteByName('PRIVATESALES_PASTSALES'); Configuration::deleteByName('PRIVATESALES_FUTURESALES'); Configuration::deleteByName('PRIVATESALES_SAME_CATEGORY'); Configuration::deleteByName('PRIVATESALES_SAME_CATEGORY_NUMBER'); Configuration::deleteByName('PRIVATESALES_SHOWHOME'); Configuration::deleteByName('PRIVATESALES_COLUMN'); Configuration::deleteByName('PRIVATESALES_TRAILER_COLUMN'); Configuration::deleteByName('PRIVATESALES_SEND_ALERT_LIMIT'); return true; } /** * */ public function createTab(){ $langs = Language::getLanguages(); $id_lang = (int)Configuration::get('PS_LANG_DEFAULT'); $tabs_i18n = array( 'fr' => array( 'Ventes Privées', ), 'en' => array( 'Private sales', ), ); $tab0 = new Tab(); $tab0->class_name = "AdminPrivateSales"; $tab0->module = "privatesales"; $tab0->id_parent = 0; $tab0->position = 5; foreach($langs as $lang){ if(isset($tabs_i18n[$lang['iso_code']])) { $tab0->name[$lang['id_lang']] = $tabs_i18n[$lang['iso_code']][0]; } else { $tab0->name[$lang['id_lang']] = $tabs_i18n['en'][0]; } } $tab0->save(); $blog_tab_id = $tab0->id; $tabs_i18n = array( 'fr' => array( 'Gestions des ventes', ), 'en' => array( 'Sales management', ), ); $tab1 = new Tab(); $tab1->class_name = "AdminPrivateSales"; $tab1->module = "privatesales"; $tab1->id_parent = $blog_tab_id; foreach($langs as $lang){ if(isset($tabs_i18n[$lang['iso_code']])) { $tab1->name[$lang['id_lang']] = $tabs_i18n[$lang['iso_code']][0]; } else { $tab1->name[$lang['id_lang']] = $tabs_i18n['en'][0]; } } $tab1->save(); $tabs_i18n = array( 'fr' => array( 'Catégorie Ventes Privées', ), 'en' => array( 'Category Private sales', ), ); $tab3 = new Tab(); $tab3->class_name = "AdminPrivateSalesCategory"; $tab3->module = "privatesales"; $tab3->id_parent = $blog_tab_id; foreach($langs as $lang){ if(isset($tabs_i18n[$lang['iso_code']])) { $tab3->name[$lang['id_lang']] = $tabs_i18n[$lang['iso_code']][0]; } else { $tab3->name[$lang['id_lang']] = $tabs_i18n['en'][0]; } } $tab3->save(); $tabs_i18n = array( 'fr' => array( 'Préférences Ventes Privées', ), 'en' => array( 'Private sales', ), ); $tab2 = new Tab(); $tab2->class_name = "AdminPreferencePrivateSales"; $tab2->module = "privatesales"; $tab2->id_parent = $blog_tab_id; foreach($langs as $lang){ if(isset($tabs_i18n[$lang['iso_code']])) { $tab2->name[$lang['id_lang']] = $tabs_i18n[$lang['iso_code']][0]; } else { $tab2->name[$lang['id_lang']] = $tabs_i18n['en'][0]; } } $tab2->save(); } /** * */ public function deleteTab(){ if ($id_tab = Tab::getIdFromClassName('AdminPrivateSales')) { $tab = new Tab((int)$id_tab); $tab->delete(); } if ($id_tab = Tab::getIdFromClassName('AdminPreferencePrivateSales')) { $tab = new Tab((int)$id_tab); $tab->delete(); } if ($id_tab = Tab::getIdFromClassName('AdminPrivateSalesCategory')) { $tab = new Tab((int)$id_tab); $tab->delete(); } if ($id_tab = Tab::getIdFromClassName('AdminPrivateSales')) { $tab = new Tab((int)$id_tab); $tab->delete(); } } /** * * @return boolean */ public function installDb(){ $statements = array(); $statements[] = 'CREATE TABLE IF NOT EXISTS `'._DB_PREFIX_.'privatesales` ( `id_privatesales` int(11) NOT NULL AUTO_INCREMENT, `id_category` int(11), `date_start_hotspot` datetime NOT NULL DEFAULT "0000-00-00 00:00:00", `date_end_hotspot` datetime NOT NULL DEFAULT "0000-00-00 00:00:00", `date_start` datetime NOT NULL DEFAULT "0000-00-00 00:00:00", `date_end` datetime NOT NULL DEFAULT "0000-00-00 00:00:00", `date_shipping` date NOT NULL DEFAULT "0000-00-00", `percent` int(11), `active` int(11), `archived` int(11), `flash` int(11), `news` int(11), `alert` int(11), `position` int(11), `date_add` datetime NOT NULL DEFAULT "0000-00-00 00:00:00", `date_upd` datetime NOT NULL DEFAULT "0000-00-00 00:00:00", PRIMARY KEY (`id_privatesales`) ) ENGINE='._MYSQL_ENGINE_.' DEFAULT CHARSET=utf8 ;'; $statements[] = 'CREATE TABLE IF NOT EXISTS `'._DB_PREFIX_.'privatesales_lang` ( `id_privatesales` int(11), `id_lang` int(11), `title` varchar(255), `subtitle` varchar(255), `description` TEXT, `description_newsletter` TEXT, PRIMARY KEY (`id_privatesales`,`id_lang`) ) ENGINE='._MYSQL_ENGINE_.' DEFAULT CHARSET=utf8 ;'; $statements[] = 'CREATE TABLE IF NOT EXISTS `'._DB_PREFIX_.'privatesales_group` ( `id_privatesales` int(11), `id_group` int(11), PRIMARY KEY (`id_privatesales`,`id_group`) ) ENGINE='._MYSQL_ENGINE_.' DEFAULT CHARSET=utf8 ;'; $statements[] = 'CREATE TABLE IF NOT EXISTS `'._DB_PREFIX_.'privatesales_brand` ( `id_privatesales` int(11), `id_brand` int(11), PRIMARY KEY (`id_privatesales`,`id_brand`) ) ENGINE='._MYSQL_ENGINE_.' DEFAULT CHARSET=utf8 ;'; $statements[] = 'CREATE TABLE IF NOT EXISTS `'._DB_PREFIX_.'privatesales_shop` ( `id_privatesales` int(11), `id_shop` int(11), PRIMARY KEY (`id_privatesales`,`id_shop`) ) ENGINE='._MYSQL_ENGINE_.' DEFAULT CHARSET=utf8 ;'; $statements[] = 'CREATE TABLE IF NOT EXISTS `'._DB_PREFIX_.'privatesales_alertmail` ( `id_privatesales_alertmail` int(11) NOT NULL AUTO_INCREMENT, `id_privatesales` int(11), `id_user` int(11) DEFAULT NULL, `email` varchar(255), PRIMARY KEY (`id_privatesales_alertmail`) ) ENGINE='._MYSQL_ENGINE_.' DEFAULT CHARSET=utf8 ;'; $statements[] = 'CREATE TABLE IF NOT EXISTS `'._DB_PREFIX_.'privatesales_alertmail_category` ( `id_privatesales_alertmail_category` int(11) NOT NULL AUTO_INCREMENT, `id_privatesales_category` int(11), `id_user` int(11) DEFAULT NULL, `email` varchar(255), PRIMARY KEY (`id_privatesales_alertmail_category`) ) ENGINE='._MYSQL_ENGINE_.' DEFAULT CHARSET=utf8 ;'; $statements[] = 'CREATE TABLE IF NOT EXISTS `'._DB_PREFIX_.'privatesales_category` ( `id_privatesales_category` int(11) NOT NULL AUTO_INCREMENT, `id_parent` int(11), `active` int(11), PRIMARY KEY (`id_privatesales_category`) ) ENGINE='._MYSQL_ENGINE_.' DEFAULT CHARSET=utf8 ;'; $statements[] = 'CREATE TABLE IF NOT EXISTS `'._DB_PREFIX_.'privatesales_category_lang` ( `id_privatesales_category` int(11), `id_lang` int(11), `title` varchar(255), `alias` varchar(255), `description` TEXT, PRIMARY KEY (`id_privatesales_category`,`id_lang`) ) ENGINE='._MYSQL_ENGINE_.' DEFAULT CHARSET=utf8 ;'; $statements[] = 'CREATE TABLE IF NOT EXISTS `'._DB_PREFIX_.'privatesales_category_sales` ( `id_privatesales_category` int(11), `id_privatesales` int(11), PRIMARY KEY (`id_privatesales_category`,`id_privatesales`) ) ENGINE='._MYSQL_ENGINE_.' DEFAULT CHARSET=utf8 ;'; $statements[] = 'CREATE TABLE IF NOT EXISTS `'._DB_PREFIX_.'privatesales_historique` ( `id_privatesales_historique` int(11) NOT NULL AUTO_INCREMENT, `id_privatesales` int(11), `date_start` datetime NOT NULL DEFAULT "0000-00-00 00:00:00", `date_end` datetime NOT NULL DEFAULT "0000-00-00 00:00:00", `date_add` datetime NOT NULL DEFAULT "0000-00-00 00:00:00", PRIMARY KEY (`id_privatesales_historique`) ) ENGINE='._MYSQL_ENGINE_.' DEFAULT CHARSET=utf8 ;'; return $this->uninstallDb() && $this->updateDb($statements); } /** * * @return boolean */ public function uninstallDb(){ $statements = array(); $statements[] = 'DROP TABLE IF EXISTS `'._DB_PREFIX_.'privatesales` ;'; $statements[] = 'DROP TABLE IF EXISTS `'._DB_PREFIX_.'privatesales_lang` ;'; $statements[] = 'DROP TABLE IF EXISTS `'._DB_PREFIX_.'privatesales_group` ;'; $statements[] = 'DROP TABLE IF EXISTS `'._DB_PREFIX_.'privatesales_shop` ;'; $statements[] = 'DROP TABLE IF EXISTS `'._DB_PREFIX_.'privatesales_alertmail_category` ;'; $statements[] = 'DROP TABLE IF EXISTS `'._DB_PREFIX_.'privatesales_alertmail` ;'; $statements[] = 'DROP TABLE IF EXISTS `'._DB_PREFIX_.'privatesales_category_lang` ;'; $statements[] = 'DROP TABLE IF EXISTS `'._DB_PREFIX_.'privatesales_category_sales` ;'; $statements[] = 'DROP TABLE IF EXISTS `'._DB_PREFIX_.'privatesales_historique` ;'; return $this->updateDb($statements); } /** * * @param array $statements * @return boolean */ public function updateDb($statements){ foreach($statements as $statement){ if( !Db::getInstance()->execute($statement)){ return false; } } return true; } /************************/ /********* HOOK *********/ /************************/ /** * * @param type $params */ public function hookDisplayHeader($params){ $this->context->controller->addCSS(($this->_path).'css/privatesales.css', 'all'); $this->context->controller->addJS(_PS_THEME_DIR_.'js/owl.js'); $this->context->controller->addCss(_PS_THEME_DIR_.'css/owl.css'); $this->context->controller->addJS(_PS_MODULE_DIR_.'privatesales/js/countdown/jquery.countdown.js'); $this->context->controller->addJS(_PS_MODULE_DIR_.'privatesales/js/countdown/jquery.countdown-'.strtolower(Language::getIsoById($this->context->language->id)).'.js'); if ( Tools::getValue('controller') == 'authentication' && Tools::getValue('ps') == '0' ){ $errors = $this->l('You must be connected for see the privatesales'); } $this->context->smarty->assign('popup_connection', Configuration::get('PRIVATESALES_POPUP_CONNECTION')); if ( Tools::getValue('controller') == 'category' || Tools::getValue('controller') == 'product' ){ if(Tools::getValue('controller') == 'category'){ $id_category = (int) Tools::getValue('id_category'); $url_back = $this->context->link->getCategoryLink($id_category); }else{ $product = new Product((int) Tools::getValue('id_product')); $id_category = (int)$product->id_category_default; $url_back = $this->context->link->getProductLink($product); } $this->privatesale = SaleCore::loadSaleFromCategoryId($id_category, (int) $this->context->cookie->id_lang); if ($this->privatesale){ if(!$this->privatesale->isOpen()) { $categories = Db::getInstance()->ExecuteS(' SELECT c.`id_category` FROM `'._DB_PREFIX_.'category_product` c WHERE c.`id_product` = '.(int) $product->id.' AND c.`id_category` != '.(int) $product->id_category_default.' ORDER BY c.`id_category` '); foreach ($categories as $key => $cat) { $sale = SaleCore::loadSaleFromCategoryId($cat['id_category'], (int) $this->context->cookie->id_lang); if ($sale) { if ($sale->isOpen()) { $id_category = (int) $cat['id_category']; $this->privatesale = $sale; break; } } } } } //OLD : $this->context->link->getModuleLink('privatesales', 'home') // if($this->privatesale && !$params['cookie']->logged){ // $redirect_string = '&'.Tools::getRedirectString(); // Tools::redirect($this->context->link->getPageLink('authentication',null,$this->context->cookie->id_lang,'ps=0&back='.$url_back.$redirect_string)); // }else if($this->privatesale /*&& $params['cookie']->logged*/){ if( strtotime($this->privatesale->date_start) > time() || !$this->privatesale->active /*|| count(array_intersect( Customer::getGroupsStatic((int) $this->context->cookie->id_customer), $this->privatesale->getGroups() )) == 0*/){ Tools::redirect($this->context->link->getModuleLink('privatesales', 'trailer' , array('id_sale' => $this->privatesale->id_privatesales ))); } if(strtotime($this->privatesale->date_end) < time()){ $this->context->smarty->assign(array( 'PS_CATALOG_MODE' => true, )); } $this->context->smarty->assign(array( 'privatesale' => $this->privatesale, 'link_img' => __PS_BASE_URI__.'modules/privatesales/img/', )); } } if ( Tools::getValue('controller') == 'category' && Tools::getValue('id_category') == Configuration::get('PRIVATESALES_ROOT')){ $redirect_string = Tools::getRedirectString(); $url = $this->context->link->getModuleLink('privatesales', 'home'); Tools::redirect( $url . (strpos($url, '?') ? '&' : '?' ) . $redirect_string ); } $products = $this->context->cart->getProducts(); $deletedprod = 0; foreach ($products as $product){ $id_category = (int)$product['id_category_default']; $privatesale = SaleCore::loadSaleFromCategoryId($id_category, (int) $this->context->cookie->id_lang); if ($privatesale) { if (!$privatesale->isOpen()) { $categories = Db::getInstance()->ExecuteS(' SELECT c.`id_category` FROM `'._DB_PREFIX_.'category_product` c WHERE c.`id_product` = '.(int) $product['id_product'].' AND c.`id_category` != '.(int) $product['id_category_default'].' ORDER BY c.`id_category` '); foreach ($categories as $key => $cat) { $sale = SaleCore::loadSaleFromCategoryId($cat['id_category'], (int) $this->context->cookie->id_lang); if ($sale) { if ($sale->isOpen()) { $id_category = (int) $cat['id_category']; $privatesale = $sale; break; } } } } } if (!$privatesale) continue; if( strtotime($privatesale->date_start) > time() || strtotime($privatesale->date_end) < time() || !$privatesale->active || count(array_intersect( Customer::getGroupsStatic((int) $this->context->cookie->id_customer), $privatesale->getGroups() )) == 0){ $this->context->cart->deleteProduct((int)$product['id_product']); $deletedprod++; } } if($deletedprod){ $this->context->smarty->assign(array( 'deletedprod' => $deletedprod )); } } /** * * @param type $params */ public function hookLeftColumn($params){ return $this->hookRightColumn($params); } /** * * @param type $params */ public function hookDisplayTopColumn($params){ return $this->hookRightColumn($params); } /** * * @param type $params */ public function hookRightColumn($params){ if ( Tools::getValue('controller') == 'category'){ if(Tools::getValue('controller') == 'category'){ $id_category = (int) Tools::getValue('id_category'); }else{ $product = new Product((int) Tools::getValue('id_product')); $id_category = (int)$product->id_category_default; } $privatesale = SaleCore::loadSaleFromCategoryId($id_category, (int) $this->context->cookie->id_lang); if ($privatesale) { if (!$privatesale->isOpen()) { $categories = Db::getInstance()->ExecuteS(' SELECT c.`id_category` FROM `'._DB_PREFIX_.'category_product` c WHERE c.`id_product` = '.(int) $product->id.' AND c.`id_category` != '.(int) $product->id_category_default.' ORDER BY c.`id_category` '); foreach ($categories as $key => $cat) { $sale = SaleCore::loadSaleFromCategoryId($cat['id_category'], (int) $this->context->cookie->id_lang); if ($sale) { if ($sale->isOpen()) { $id_category = (int) $cat['id_category']; $privatesale = $sale; break; } } } } } if($privatesale){ $this->context->smarty->assign(array( 'privatesale' => $privatesale, 'link_img' => __PS_BASE_URI__.'modules/privatesales/img/', )); return $this->display(__FILE__, 'logocat.tpl'); } } } /** * * @param type $params */ public function hookModuleRoutes($params){ $tab_routes = array(); if(Configuration::get('PRIVATESALES_SEO_'.strtoupper($this->context->language->iso_code))){ $url = Configuration::get('PRIVATESALES_SEO_'.strtoupper($this->context->language->iso_code)); }else{ $url = Configuration::get('PRIVATESALES_SEO_EN'); } if(Configuration::get('PRIVATESALES_SEOTRAILER_'.strtoupper($this->context->language->iso_code))){ $urltrailer = Configuration::get('PRIVATESALES_SEOTRAILER_'.strtoupper($this->context->language->iso_code)); }else{ $urltrailer = Configuration::get('PRIVATESALES_SEOTRAILER_EN'); } $tab_routes['module-privatesales-homecat'] = array( 'controller' => 'homecat', 'rule' => $url.'/{:id_sale_category}-{:alias}', 'keywords' => array( 'alias' => array('regexp' => '[a-zA-Z-0-9]*' , 'param' => 'alias'), 'id_sale_category' => array('regexp' => '[0-9]*' , 'param' => 'id_sale_category'), ), 'params' => array( 'fc' => 'module', 'module' => 'privatesales', ) ); if(Configuration::get('PRIVATESALES_SHOWHOME')){ $url = ""; } $tab_routes['module-privatesales-home'] = array( 'controller' => 'home', 'rule' => $url, 'keywords' => array( ), 'params' => array( 'fc' => 'module', 'module' => 'privatesales', ) ); $tab_routes['module-privatesales-trailer'] = array( 'controller' => 'trailer', 'rule' => $urltrailer.'/{:id_sale}', 'keywords' => array( 'id_sale' => array('regexp' => '[a-zA-Z-0-9]*' , 'param' => 'id_sale') ), 'params' => array( 'fc' => 'module', 'module' => 'privatesales', ) ); return $tab_routes; } /** * */ public function hookDisplayHomeTab(){ $this->context->smarty->assign(array( 'link_ps' => $this->context->link->getModuleLink('privatesales', 'home' ) )); return $this->display(__FILE__, 'hometab.tpl'); } /** * */ public function hookDisplayBackOfficeHeader(){ $this->context->controller->addCss(_PS_MODULE_DIR_.'privatesales/css/admin.css'); } /** * */ public function hookDisplayCategoryFooter(){ if ( !Configuration::get('PRIVATESALES_SAME_CATEGORY') || !$this->privatesale ) return; $inSameSaleCategorySales = $this->privatesale->getInSameSaleCategory(Configuration::get('PRIVATESALES_SAME_CATEGORY_NUMBER')); $this->context->smarty->assign('inSameSaleCategorySales', $inSameSaleCategorySales); return $this->display(__FILE__, 'inSameSaleCategory.tpl'); } /** * * @param type $params */ public function hookDisplayBottomCategory($params){ if ( !$this->privatesale ) return; // $sales = SaleCore::getInSameSaleCategory($this->privatesale->id); $sales = SaleCore::getSales('current', 0, true, false, true, 'rand'); if($sales){ $this->context->smarty->assign(array( 'current_sale' => $this->privatesale, 'sales' => $sales, 'link_img' => 'modules/privatesales/img/', 'link_mod_img' => _PS_MODULE_DIR_.'modules/privatesales/img/' )); return $this->display(__FILE__, 'bottomCategory.tpl'); } } public function hookDisplayProductTabContent($params){ global $smarty; $product = new Product((int) $params['product']->id); $id_category = (int)$product->id_category_default; $privatesale = SaleCore::loadSaleFromCategoryId($id_category, (int) $this->context->cookie->id_lang); if ($privatesale) { if (!$privatesale->isOpen()) { $categories = Db::getInstance()->ExecuteS(' SELECT c.`id_category` FROM `'._DB_PREFIX_.'category_product` c WHERE c.`id_product` = '.(int) $product->id.' AND c.`id_category` != '.(int) $product->id_category_default.' ORDER BY c.`id_category` '); foreach ($categories as $key => $cat) { $sale = SaleCore::loadSaleFromCategoryId($cat['id_category'], (int) $this->context->cookie->id_lang); if ($sale) { if ($sale->isOpen()) { $id_category = (int) $cat['id_category']; $privatesale = $sale; break; } } } } } if($privatesale){ $this->context->smarty->assign(array( 'privatesale' => $privatesale, 'product' => $product, )); return $this->display(__FILE__, 'views/templates/hook/displayProductTabContent.tpl'); } } }