i-install.php => interface * => install-ctrl_class.php => controller, manage factory with config or sql install object * => install-config classes => manage install / uninstall of config values (register hook) * => install-sql classes => manage install / uninstall of sql queries * => install-tab classes => manage install / uninstall of admin tab * lib/admin * => i-admin.php => interface * => admin-ctrl_class.php => controller, manage factory with configure or update admin object * => display => manage displaying of basic settings and search form in admin tab * => update => manage updating of basic settings * => export => manage exporting of report file in admin tab * lib/module-dao_class.php * D A O = Data Access Object => manage all sql queries * lib/module-tools_class.php * declare all transverse functions which are unclassifiable in specific class * lib/warnings_class.php * manage all displaying warnings when module isn't already configured after installation * @date 10/04/2012 * @revision 01/10/2014 */ if (!defined('_PS_VERSION_')) { exit(1); } class OrderTaxProfitReport extends Module { /** * @var array $aConfiguration : array of set configuration */ public static $aConfiguration = array(); /** * @var int $iCurrentLang : store id of default lang */ public static $iCurrentLang = null; /** * @var int $sCurrentLang : store iso code of default lang */ public static $sCurrentLang = null; /** * @var obj $oModule : obj module itself */ public static $oModule = array(); /** * @var string $sQueryMode : query mode - detect XHR */ public static $sQueryMode = null; /** * @var string $sBASE_URI : base of URI in prestashop */ public static $sBASE_URI = null; /** * @var array $aError : array get error */ public $aError = array('msg' => null, 'code' => null); /** * @var int $iShopId : shop id used for 1.5 and for multi shop */ public static $iShopId = 1; /** * @var obj $oCookie : store cookie obj */ public static $oCookie = null; /** * Magic Method __construct assigns few information about module and instantiate parent class */ public function __construct() { // hack for older version than 1 4 5 1 if (version_compare(_PS_VERSION_, '1.4.5.1') == -1) { require_once(_PS_MODULE_DIR_ . 'ordertaxprofitreport/conf/common.conf.php'); } else { require_once(dirname(__FILE__) . '/conf/common.conf.php'); } require_once(_OTPR_PATH_LIB . 'module-tools_class.php'); // use case - get context if (version_compare(_PS_VERSION_, '1.5', '>')) { $cookie = Context::getContext()->cookie; self::$iShopId = Context::getContext()->shop->id; } else { global $cookie; } // get cookie obj self::$oCookie = $cookie; // get default id lang self::$iCurrentLang = self::$oCookie->id_lang; // get default iso lang self::$sCurrentLang = BT_OtprModuleTools::getIsoLang(); $this->name = 'ordertaxprofitreport'; $this->tab = 'billing_invoicing'; $this->version = '2.9.1'; $this->author = 'Business Tech'; $this->module_key = '9d25192b2d4a6901df631d9e8648891f'; parent::__construct(); $this->displayName = $this->l('Order, Tax and Profit Report'); $this->description = $this->l('Configure and export your "Order, Tax and Profit Report"'); $this->confirmUninstall = $this->l('Are you sure you want to remove it ? Your "Order, Tax and Profit Report" will no longer work.'); // stock itself obj self::$oModule = $this; // set base of URI self::$sBASE_URI = $this->_path; // get configuration options BT_OtprModuleTools::getConfiguration(); // defines variable for way // @uses with admin tab interface $GLOBALS[_OTPR_MODULE_NAME . '_WAY'] = array( 'ASC' => $this->l('ascending'), 'DESC' => $this->l('descending'), ); // get call mode - Ajax or dynamic - used for clean headers and footer in ajax request self::$sQueryMode = Tools::getValue('sMode'); } /** * install() method installs all mandatory structure (DB or Files) => sql queries and update values and admin tab * * @return bool */ public function install() { require_once(_OTPR_PATH_CONF . 'install.conf.php'); require_once(_OTPR_PATH_LIB_INSTALL . 'install-ctrl_class.php'); // set return $bReturn = true; if ( !parent::install() || !BT_InstallCtrl::run('install', 'config') || !BT_InstallCtrl::run('install', 'sql', _OTPR_PATH_SQL . _OTPR_INSTALL_SQL_FILE) || !BT_InstallCtrl::run('install', 'tab') ) { $bReturn = false; } // use case - add already defined report templates else { require_once(_OTPR_PATH_LIB . 'module-dao_class.php'); // register templates report $bReturn = BT_OtprModuleTools::setReportTemplate(); } return $bReturn; } /** * uninstall() method uninstalls all mandatory structure (DB or Files) * * @return bool */ public function uninstall() { require_once(_OTPR_PATH_CONF . 'install.conf.php'); require_once(_OTPR_PATH_LIB_INSTALL . 'install-ctrl_class.php'); // set return $bReturn = true; if (!parent::uninstall() || !BT_InstallCtrl::run('uninstall', 'config') || !BT_InstallCtrl::run('uninstall', 'sql', _OTPR_PATH_SQL . _OTPR_UNINSTALL_SQL_FILE) || !BT_InstallCtrl::run('uninstall', 'tab') ) { $bReturn = false; } return $bReturn; } /** * getContent() method manages all data in Back Office (admin tab too) * * @return string */ public function getContent() { require_once(_OTPR_PATH_CONF . 'admin.conf.php'); require_once(_OTPR_PATH_LIB_ADMIN . 'admin-ctrl_class.php'); // set $aUpdateModule = array(); try { // get configuration options BT_OtprModuleTools::getConfiguration(); // set js msg translation BT_OtprModuleTools::setTranslatedJsMsg(); // instantiate admin controller object $oAdmin = new BT_AdminCtrl(); // defines type to execute // use case : no key sAction sent in POST mode (no form have been posted => first page is displayed with admin-display.class.php) //use case : keys sAction & sType sent in POST mode (form or ajax query posted => use with update basic settings / export report $sAction = (!Tools::getIsset('sAction') || (Tools::getIsset('sAction') && 'display' == Tools::getValue('sAction')))? 'display' : Tools::getValue('sAction'); // use case - module updating // make module update only in case of display general admin page if ($sAction == 'display' && (empty($_REQUEST['sType']) || $_REQUEST['sType'] == 'searchForm')) { // update module if necessary $aUpdateModule = $this->_updateModule(); } else { // use case - update module version Configuration::updateValue(_OTPR_MODULE_NAME . '_MODULE_VERSION', $this->version); } // update new module keys BT_OtprModuleTools::updateConfiguration(); // execute good action in admin // only displayed with key : tpl and assign in order to display good smarty template $aDisplay = $oAdmin->run($sAction, $_REQUEST); // free memory unset($oAdmin); if (!empty($aDisplay)) { $aParams = array( 'aUpdateErrors' => $aUpdateModule, 'oJsTranslatedMsg' => BT_OtprModuleTools::jsonEncode($GLOBALS[_OTPR_MODULE_NAME . '_JS_MSG']), 'iCompare' => version_compare(_PS_VERSION_, '1.4.4.1'), 'iCompare15' => version_compare(_PS_VERSION_, '1.5.0', '>'), ); // get content $sContent = $this->displayModule($aDisplay['tpl'], array_merge($aDisplay['assign'], $aParams)); if (!empty(self::$sQueryMode)) { echo $sContent; } else { return $sContent; } } else { throw new Exception('action returns empty content', 110); } } catch (Exception $e) { $this->aError['msg'] = $e->getMessage(); $this->aError['code'] = $e->getCode(); // get content $sContent = $this->displayErrorModule(); if (!empty(self::$sQueryMode)) { echo $sContent; } else { return $sContent; } } // exit clean in XHR mode if( !empty(self::$sQueryMode)) { exit(0); } } /** * hookNewOrder() method executes new order hook * * @param array $aParams * @return string */ public function hookNewOrder(array $aParams) { return ( $this->_execHook('validateOrder', $aParams) ); } /** * hookActionValidateOrder() method executes new order hook * * @param array $aParams * @return string */ public function hookActionValidateOrder(array $aParams) { return ( $this->_execHook('validateOrder', $aParams) ); } /** * _execHook() method displays selected hook content * * @param string $sHookType * @param array $aParams * @return string */ private function _execHook($sHookType, array $aParams = null) { // include require_once(_OTPR_PATH_CONF . 'hook.conf.php'); require_once(_OTPR_PATH_LIB_HOOK . 'hook_class.php'); try { // define which hook class is executed in order to display good content in good zone in shop $oHook = new BT_OtprHook($sHookType); // displays good block content $aDisplay = $oHook->run($aParams); // free memory unset($oHook); // execute good action in admin // only displayed with key : tpl and assign in order to display good smarty template if (!empty($aDisplay)) { return ( $this->displayModule($aDisplay['tpl'], $aDisplay['assign']) ); } else { throw new Exception('Choosen hook returns empty content', 110); } } catch (Exception $e) { $this->aErrors[] = array('msg' => $e->getMessage(), 'code' => $e->getCode()); return ( $this->displayErrorModule() ); } } /** * setErrorHandler() method manages module error * * @param string $sTplName * @param array $aAssign */ public function setErrorHandler($iErrno, $sErrstr, $sErrFile, $iErrLine, $aErrContext) { switch ($iErrno) { case E_USER_ERROR : $this->aError['code'] = $iErrno; $this->aError['msg'] = 'Fatal error ' . $sErrstr . ''; break; case E_USER_WARNING : $this->aError['code'] = $iErrno; $this->aError['msg'] = 'Warning ' . $sErrstr . ''; break; case E_USER_NOTICE : $this->aError['code'] = $iErrno; $this->aError['msg'] = 'Notice ' . $sErrstr . ''; break; default : $this->aError['code'] = $iErrno; $this->aError['msg'] = 'Unknow error ' . $sErrstr . ''; break; } return ( $this->displayErrorModule() ); } /** * displayModule() method displays view * * @param string $sTplName * @param array $aAssign * @return string html */ public function displayModule($sTplName, $aAssign) { if (file_exists(_OTPR_PATH_TPL . $sTplName) && is_file(_OTPR_PATH_TPL . $sTplName)) { global $smarty; // set assign module name $aAssign = array_merge($aAssign, array('sModuleName' => Tools::strtolower(_OTPR_MODULE_NAME), 'bDebug' => _OTPR_DEBUG, 'sTs' => time())); $smarty->assign($aAssign); return ( $this->display(__FILE__, _OTPR_PATH_TPL_NAME . $sTplName) ); } else { throw new Exception('Template doesn\'t exists', 120); } } /** * displayErrorModule() method displays view with error * * @return string html */ public function displayErrorModule() { global $smarty; $smarty->assign( array( 'sHomeURI' => BT_OtprModuleTools::truncateUri(), 'aErrors' => array($this->aError), 'sErrorTplPath' => _OTPR_PATH_TPL . _OTPR_TPL_ERROR, 'sModuleName' => Tools::strtolower(_OTPR_MODULE_NAME), 'bDebug' => _OTPR_DEBUG, ) ); return ( $this->display(__FILE__, _OTPR_PATH_TPL_NAME . _OTPR_TPL_ERROR) ); } /** * _updateModule() method updates module as necessary * * @return array */ private function _updateModule() { $aErrors = array(); // include require_once(_OTPR_PATH_LIB . 'module-dao_class.php'); // set transaction Db::getInstance()->Execute('BEGIN'); // get templates $aTemplates = BT_OtprModuleDao::getTemplates(); foreach ($GLOBALS[_OTPR_MODULE_NAME . '_SEARCH_TEMPLATE'] as $sReportName => $aTemplate) { if (!array_key_exists($sReportName, $aTemplates)) { if (!BT_OtprModuleDao::addTemplate($sReportName, array('cols' => $aTemplate['cols'], 'group' => $aTemplate['group']), $aTemplate['lang'])) { $aErrors[] = array('sql' => array('table' => 'ps_configuration', 'file' => $this->l('update template') . ' => "' . $sReportName . '" ' . $this->l('ko'))); } } else { if (!BT_OtprModuleDao::addTemplate($sReportName, array('cols' => $aTemplate['cols'], 'group' => $aTemplate['group']), $aTemplate['lang'], $aTemplates[$sReportName]['id'])) { $aErrors[] = array('sql' => array('table' => 'ps_configuration', 'file' => $this->l('update template') . ' => "' . $sReportName . '" ' . $this->l('ko'))); } } } // use case - table to add if (!empty($GLOBALS[_OTPR_MODULE_NAME . '_SQL_UPDATE']['table'])) { // loop on each elt to update SQL foreach ($GLOBALS[_OTPR_MODULE_NAME . '_SQL_UPDATE']['table'] as $sTable => $sSqlFile) { // execute query $bResult = Db::getInstance()->ExecuteS('SHOW TABLES LIKE "' . _DB_PREFIX_ . Tools::strtolower(_OTPR_MODULE_NAME) . '_'. $sTable .'"'); // if empty - update if (empty($bResult)) { require_once(_OTPR_PATH_CONF . 'install.conf.php'); require_once(_OTPR_PATH_LIB_INSTALL . 'install-ctrl_class.php'); // use case - KO update if (!BT_InstallCtrl::run('install', 'sql', _OTPR_PATH_SQL . $sSqlFile)) { $aErrors[] = array('sql' => array('table' => $sTable, 'file' => $sSqlFile)); } } } } // use case - field to add if (!empty($GLOBALS[_OTPR_MODULE_NAME . '_SQL_UPDATE']['field']) && empty($aErrors)) { // loop on each elt to update SQL foreach ($GLOBALS[_OTPR_MODULE_NAME . '_SQL_UPDATE']['field'] as $sFieldName => $aOption) { // execute query $bResult = Db::getInstance()->ExecuteS('SHOW COLUMNS FROM ' . _DB_PREFIX_ . Tools::strtolower(_OTPR_MODULE_NAME) . '_'. $aOption['table'] . ' LIKE "' . $sFieldName .'"'); // if empty - update if (empty($bResult)) { require_once(_OTPR_PATH_CONF . 'install.conf.php'); require_once(_OTPR_PATH_LIB_INSTALL . 'install-ctrl_class.php'); // use case - KO update if (!BT_InstallCtrl::run('install', 'sql', _OTPR_PATH_SQL . $aOption['file'])) { $aErrors[] = array('sql' => array('field' => $sFieldName, 'linked' => $aOption['table'], 'file' => $aOption['file'])); } } } } // use case - add hook if (empty($aErrors)) { require_once(_OTPR_PATH_CONF . 'install.conf.php'); require_once(_OTPR_PATH_LIB_INSTALL . 'install-ctrl_class.php'); // use case - register ko if (!BT_InstallCtrl::run('install', 'config', array('bHookOnly' => true))) { $aErrors[] = array('sql' => array('table' => 'ps_hook_module', 'file' => $this->l('register hooks KO'))); } // execute query $bResult = Db::getInstance()->ExecuteS('SHOW COLUMNS FROM ' . _DB_PREFIX_ . Tools::strtolower(_OTPR_MODULE_NAME) . '_order_wrapping LIKE "WRA_ID_ORDER_DETAIL"'); // check module version for uninstall and install SQL if (!empty($bResult)) { // use case - uninstall if (!BT_InstallCtrl::run('uninstall', 'sql', _OTPR_PATH_SQL . _OTPR_UNINSTALL_SQL_FILE)) { $aErrors[] = array('sql' => array('table' => $this->l('all'), 'file' => _OTPR_PATH_SQL . OTPR_UNINSTALL_SQL_FILE)); } // use case - install if (!BT_InstallCtrl::run('install', 'sql', _OTPR_PATH_SQL . _OTPR_INSTALL_SQL_FILE)) { $aErrors[] = array('sql' => array('table' => $this->l('all'), 'file' => _OTPR_PATH_SQL . _OTPR_INSTALL_SQL_FILE)); } } // use case - compile templates files require_once(_OTPR_PATH_LIB_COMMON . 'dir-reader.class.php'); // get templates files $aTplFiles = BT_DirReader::create()->run(array('path' => _OTPR_PATH_TPL, 'recursive' => true, 'extension' => 'tpl', 'subpath' => true)); if (!empty($aTplFiles)) { global $smarty; foreach ($aTplFiles as $aFile) { if (method_exists($smarty, 'clearCompiledTemplate')) { $smarty->clearCompiledTemplate($aFile['filename']); } elseif (method_exists($smarty, 'clear_compiled_tpl')) { $smarty->clear_compiled_tpl($aFile['filename']); } } } } if (empty($aErrors)) { Db::getInstance()->Execute('COMMIT'); Configuration::updateValue(_OTPR_MODULE_NAME . '_MODULE_VERSION', $this->version); } else { Db::getInstance()->Execute('ROLLBACK'); } return $aErrors; } }