/** * Sets up the Payment settings view * @param \Cx\Core\Html\Sigma $objTemplate The optional Template, * by reference * @return boolean True on success, * false otherwise */ static function view_settings(&$objTemplate = null) { if (!$objTemplate) { $objTemplate = new \Cx\Core\Html\Sigma(); $objTemplate->loadTemplateFile('module_shop_settings_payment.html'); } else { $objTemplate->addBlockfile('SHOP_SETTINGS_FILE', 'settings_block', 'module_shop_settings_payment.html'); } $i = 0; foreach (Payment::getArray() as $payment_id => $arrPayment) { $zone_id = Zones::getZoneIdByPaymentId($payment_id); $objTemplate->setVariable(array('SHOP_PAYMENT_STYLE' => 'row' . (++$i % 2 + 1), 'SHOP_PAYMENT_ID' => $arrPayment['id'], 'SHOP_PAYMENT_NAME' => $arrPayment['name'], 'SHOP_PAYMENT_HANDLER_MENUOPTIONS' => PaymentProcessing::getMenuoptions($arrPayment['processor_id']), 'SHOP_PAYMENT_COST' => $arrPayment['fee'], 'SHOP_PAYMENT_COST_FREE_SUM' => $arrPayment['free_from'], 'SHOP_ZONE_SELECTION' => Zones::getMenu($zone_id, "zone_id[{$payment_id}]"), 'SHOP_PAYMENT_STATUS' => intval($arrPayment['active']) ? \Html::ATTRIBUTE_CHECKED : '')); $objTemplate->parse('shopPayment'); } $objTemplate->setVariable(array('SHOP_PAYMENT_HANDLER_MENUOPTIONS_NEW' => PaymentProcessing::getMenuoptions(-1), 'SHOP_ZONE_SELECTION_NEW' => Zones::getMenu(0, 'zone_id_new'))); // Payment Service Providers $objTemplate->setVariable(array('SHOP_PAYMILL_STATUS' => \Cx\Core\Setting\Controller\Setting::getValue('paymill_active', 'Shop') ? \Html::ATTRIBUTE_CHECKED : '', 'SHOP_PAYMILL_TEST_SELECTED' => \Cx\Core\Setting\Controller\Setting::getValue('paymill_use_test_account', 'Shop') == 0 ? \Html::ATTRIBUTE_SELECTED : '', 'SHOP_PAYMILL_LIVE_SELECTED' => \Cx\Core\Setting\Controller\Setting::getValue('paymill_use_test_account', 'Shop') == 1 ? \Html::ATTRIBUTE_SELECTED : '', 'SHOP_PAYMILL_TEST_PRIVATE_KEY' => contrexx_raw2xhtml(\Cx\Core\Setting\Controller\Setting::getValue('paymill_test_private_key', 'Shop')), 'SHOP_PAYMILL_TEST_PUBLIC_KEY' => contrexx_raw2xhtml(\Cx\Core\Setting\Controller\Setting::getValue('paymill_test_public_key', 'Shop')), 'SHOP_PAYMILL_LIVE_PRIVATE_KEY' => contrexx_raw2xhtml(\Cx\Core\Setting\Controller\Setting::getValue('paymill_live_private_key', 'Shop')), 'SHOP_PAYMILL_LIVE_PUBLIC_KEY' => contrexx_raw2xhtml(\Cx\Core\Setting\Controller\Setting::getValue('paymill_live_public_key', 'Shop')), 'SHOP_PAYMILL_PRIVATE_KEY' => contrexx_raw2xhtml(\Cx\Core\Setting\Controller\Setting::getValue('paymill_private_key', 'Shop')), 'SHOP_PAYMILL_PUBLIC_KEY' => contrexx_raw2xhtml(\Cx\Core\Setting\Controller\Setting::getValue('paymill_public_key', 'Shop')), 'SHOP_SAFERPAY_ID' => \Cx\Core\Setting\Controller\Setting::getValue('saferpay_id', 'Shop'), 'SHOP_SAFERPAY_STATUS' => \Cx\Core\Setting\Controller\Setting::getValue('saferpay_active', 'Shop') ? \Html::ATTRIBUTE_CHECKED : '', 'SHOP_SAFERPAY_TEST_ID' => \Cx\Core\Setting\Controller\Setting::getValue('saferpay_use_test_account', 'Shop'), 'SHOP_SAFERPAY_TEST_STATUS' => \Cx\Core\Setting\Controller\Setting::getValue('saferpay_use_test_account', 'Shop') ? \Html::ATTRIBUTE_CHECKED : '', 'SHOP_SAFERPAY_FINALIZE_PAYMENT' => \Cx\Core\Setting\Controller\Setting::getValue('saferpay_finalize_payment', 'Shop') ? \Html::ATTRIBUTE_CHECKED : '', 'SHOP_SAFERPAY_WINDOW_MENUOPTIONS' => \Saferpay::getWindowMenuoptions(\Cx\Core\Setting\Controller\Setting::getValue('saferpay_window_option', 'Shop')), 'SHOP_PAYREXX_INSTANCE_NAME' => \Cx\Core\Setting\Controller\Setting::getValue('payrexx_instance_name', 'Shop'), 'SHOP_PAYREXX_API_SECRET' => \Cx\Core\Setting\Controller\Setting::getValue('payrexx_api_secret', 'Shop'), 'SHOP_PAYREXX_STATUS' => \Cx\Core\Setting\Controller\Setting::getValue('payrexx_active', 'Shop') ? \Html::ATTRIBUTE_CHECKED : '', 'SHOP_YELLOWPAY_SHOP_ID' => \Cx\Core\Setting\Controller\Setting::getValue('postfinance_shop_id', 'Shop'), 'SHOP_YELLOWPAY_STATUS' => \Cx\Core\Setting\Controller\Setting::getValue('postfinance_active', 'Shop') ? \Html::ATTRIBUTE_CHECKED : '', 'SHOP_YELLOWPAY_HASH_SIGNATURE_IN' => contrexx_raw2xhtml(\Cx\Core\Setting\Controller\Setting::getValue('postfinance_hash_signature_in', 'Shop')), 'SHOP_YELLOWPAY_HASH_SIGNATURE_OUT' => contrexx_raw2xhtml(\Cx\Core\Setting\Controller\Setting::getValue('postfinance_hash_signature_out', 'Shop')), 'SHOP_YELLOWPAY_AUTHORIZATION_TYPE_OPTIONS' => \Yellowpay::getAuthorizationMenuoptions(\Cx\Core\Setting\Controller\Setting::getValue('postfinance_authorization_type', 'Shop')), 'SHOP_YELLOWPAY_USE_TESTSERVER_CHECKED' => \Cx\Core\Setting\Controller\Setting::getValue('postfinance_use_testserver', 'Shop') ? \Html::ATTRIBUTE_CHECKED : '', 'SHOP_POSTFINANCE_MOBILE_WEBUSER' => contrexx_raw2xhtml(\Cx\Core\Setting\Controller\Setting::getValue('postfinance_mobile_webuser', 'Shop')), 'SHOP_POSTFINANCE_MOBILE_SIGN' => contrexx_raw2xhtml(\Cx\Core\Setting\Controller\Setting::getValue('postfinance_mobile_sign', 'Shop')), 'SHOP_POSTFINANCE_MOBILE_IJUSTWANTTOTEST_CHECKED' => \Cx\Core\Setting\Controller\Setting::getValue('postfinance_mobile_ijustwanttotest', 'Shop') ? \Html::ATTRIBUTE_CHECKED : '', 'SHOP_POSTFINANCE_MOBILE_STATUS' => \Cx\Core\Setting\Controller\Setting::getValue('postfinance_mobile_status', 'Shop') ? \Html::ATTRIBUTE_CHECKED : '', 'SHOP_DATATRANS_AUTHORIZATION_TYPE_OPTIONS' => \Datatrans::getReqtypeMenuoptions(\Cx\Core\Setting\Controller\Setting::getValue('datatrans_request_type', 'Shop')), 'SHOP_DATATRANS_MERCHANT_ID' => \Cx\Core\Setting\Controller\Setting::getValue('datatrans_merchant_id', 'Shop'), 'SHOP_DATATRANS_STATUS' => \Cx\Core\Setting\Controller\Setting::getValue('datatrans_active', 'Shop') ? \Html::ATTRIBUTE_CHECKED : '', 'SHOP_DATATRANS_USE_TESTSERVER_YES_CHECKED' => \Cx\Core\Setting\Controller\Setting::getValue('datatrans_use_testserver', 'Shop') ? \Html::ATTRIBUTE_CHECKED : '', 'SHOP_DATATRANS_USE_TESTSERVER_NO_CHECKED' => \Cx\Core\Setting\Controller\Setting::getValue('datatrans_use_testserver', 'Shop') ? '' : \Html::ATTRIBUTE_CHECKED, 'SHOP_PAYPAL_EMAIL' => contrexx_raw2xhtml(\Cx\Core\Setting\Controller\Setting::getValue('paypal_account_email', 'Shop')), 'SHOP_PAYPAL_STATUS' => \Cx\Core\Setting\Controller\Setting::getValue('paypal_active', 'Shop') ? \Html::ATTRIBUTE_CHECKED : '', 'SHOP_PAYPAL_DEFAULT_CURRENCY_MENUOPTIONS' => \PayPal::getAcceptedCurrencyCodeMenuoptions(\Cx\Core\Setting\Controller\Setting::getValue('paypal_default_currency', 'Shop')), 'SHOP_PAYMENT_LSV_STATUS' => \Cx\Core\Setting\Controller\Setting::getValue('payment_lsv_active', 'Shop') ? \Html::ATTRIBUTE_CHECKED : '', 'SHOP_PAYMENT_DEFAULT_CURRENCY' => Currency::getDefaultCurrencySymbol(), 'SHOP_CURRENCY_CODE' => Currency::getCurrencyCodeById(Currency::getDefaultCurrencyId()))); return true; }
/** * The payment process has completed successfully. * * Check the data from the payment provider. * @access public */ static function success() { global $_ARRAYLANG; // Hide the currency navbar self::$show_currency_navbar = false; // Use the Order ID stored in the session, if possible. // Otherwise, get it from the payment processor. $order_id = empty($_SESSION['shop']['order_id_checkin']) ? PaymentProcessing::getOrderId() : $_SESSION['shop']['order_id_checkin']; //\DBG::deactivate(); //\DBG::activate(DBG_LOG_FILE); //\DBG::log("success(): Restored Order ID ".var_export($order_id, true)); // Default new order status: As long as it's pending (0, zero), // update_status() will choose the new value automatically. $newOrderStatus = Order::STATUS_PENDING; $checkinresult = PaymentProcessing::checkIn(); //\DBG::log("success(): CheckIn Result ".var_export($checkinresult, true)); if ($checkinresult === false) { // Failed payment. Cancel the order. $newOrderStatus = Order::STATUS_CANCELLED; //\DBG::log("success(): Order ID is *false*, new Status $newOrderStatus"); } elseif ($checkinresult === true) { // True is returned for successful payments. // Update the status in any case. $newOrderStatus = Order::STATUS_PENDING; //\DBG::log("success(): Order ID is *true*, new Status $newOrderStatus"); } elseif ($checkinresult === null) { // checkIn() returns null if no change to the order status // is necessary or appropriate $newOrderStatus = Order::STATUS_PENDING; //\DBG::log("success(): Order ID is *null* (new Status $newOrderStatus)"); } // Verify the Order ID with the session, if available if (isset($_SESSION['shop']['order_id_checkin']) && $order_id != $_SESSION['shop']['order_id_checkin']) { // Cancel the Order with the ID from the session, not the // possibly faked one from the request! //\DBG::log("success(): Order ID $order_id is not ".$_SESSION['shop']['order_id_checkin'].", new Status $newOrderStatus"); $order_id = $_SESSION['shop']['order_id_checkin']; $newOrderStatus = Order::STATUS_CANCELLED; $checkinresult = false; } //\DBG::log("success(): Verification complete, Order ID ".var_export($order_id, true).", Status: $newOrderStatus"); if (is_numeric($order_id)) { // The respective order state, if available, is updated. // The only exception is when $checkinresult is null. if (isset($checkinresult)) { $newOrderStatus = Orders::update_status($order_id, $newOrderStatus); //\DBG::log("success(): Updated Order Status to $newOrderStatus (Order ID $order_id)"); } else { // The old status is the new status $newOrderStatus = self::getOrderStatus($order_id); } switch ($newOrderStatus) { case Order::STATUS_CONFIRMED: case Order::STATUS_PAID: case Order::STATUS_SHIPPED: case Order::STATUS_COMPLETED: \Message::ok($_ARRAYLANG['TXT_ORDER_PROCESSED']); // Custom. // Enable if Discount class is customized and in use. //self::showCustomerDiscount(Cart::get_price()); break; case Order::STATUS_PENDING: // Pending orders must be stated as such. // Certain payment methods (like PayPal with IPN) might // be confirmed a little later and must cause the // confirmation mail to be sent. \Message::information($_ARRAYLANG['TXT_SHOP_ORDER_PENDING'] . '<br /><br />' . $_ARRAYLANG['TXT_SHOP_ORDER_WILL_BE_CONFIRMED']); break; case Order::STATUS_DELETED: case Order::STATUS_CANCELLED: \Message::error($_ARRAYLANG['TXT_SHOP_PAYMENT_FAILED'] . '<br /><br />' . $_ARRAYLANG['TXT_SHOP_ORDER_CANCELLED']); break; } } else { \Message::error($_ARRAYLANG['TXT_NO_PENDING_ORDER']); } // Avoid any output if the result is negative if (isset($_REQUEST['result']) && $_REQUEST['result'] < 0) { die(''); } self::$objTemplate->setGlobalVariable($_ARRAYLANG); // Comment this for testing, so you can reuse the same account and cart self::destroyCart(); }
/** * Cloudrexx * * @link http://www.cloudrexx.com * @copyright Cloudrexx AG 2007-2015 * * According to our dual licensing model, this program can be used either * under the terms of the GNU Affero General Public License, version 3, * or under a proprietary license. * * The texts of the GNU Affero General Public License with an additional * permission and of our proprietary license can be found at and * in the LICENSE file you have received along with this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * "Cloudrexx" is a registered trademark of Cloudrexx AG. * The licensing of the program under the AGPLv3 does not imply a * trademark license. Therefore any rights, title and interest in * our trademarks remain entirely with us. */ function _shopUpdate() { global $objDatabase, $_ARRAYLANG, $objUpdate; if (!defined('MODULE_INDEX')) { define('MODULE_INDEX', ''); } try { $table_name = DBPREFIX . 'module_shop_config'; // Mind that this table does no longer exist from version 3 if (Cx\Lib\UpdateUtil::table_exist($table_name)) { // Shop settings // Shop thumbnail default settings: shop_thumbnail_max_width $query = "\n SELECT 1 FROM `{$table_name}`\n WHERE name='shop_thumbnail_max_width'"; $objResult = $objDatabase->Execute($query); if ($objResult) { if ($objResult->RecordCount() == 0) { $query = "\n INSERT INTO `{$table_name}` (\n name, value\n ) VALUES (\n 'shop_thumbnail_max_width', '120'\n )"; $objResult = $objDatabase->Execute($query); if ($objResult) { } else { return _databaseError($query, $objDatabase->ErrorMsg()); } } } else { return _databaseError($query, $objDatabase->ErrorMsg()); } // Shop thumbnail default settings: shop_thumbnail_max_height $query = "\n SELECT 1 FROM `{$table_name}`\n WHERE name='shop_thumbnail_max_height'"; $objResult = $objDatabase->Execute($query); if ($objResult) { if ($objResult->RecordCount() == 0) { $query = "\n INSERT INTO `{$table_name}` (\n name, value\n ) VALUES (\n 'shop_thumbnail_max_height', '90'\n )"; $objResult = $objDatabase->Execute($query); if ($objResult) { } else { return _databaseError($query, $objDatabase->ErrorMsg()); } } } else { return _databaseError($query, $objDatabase->ErrorMsg()); } // Shop thumbnail default settings: shop_thumbnail_quality $query = "\n SELECT 1 FROM `{$table_name}`\n WHERE name='shop_thumbnail_quality'"; $objResult = $objDatabase->Execute($query); if ($objResult) { if ($objResult->RecordCount() == 0) { $query = "\n INSERT INTO `{$table_name}` (\n name, value\n ) VALUES (\n 'shop_thumbnail_quality', '80'\n )"; $objResult = $objDatabase->Execute($query); if ($objResult) { } else { return _databaseError($query, $objDatabase->ErrorMsg()); } } } else { return _databaseError($query, $objDatabase->ErrorMsg()); } // Add Yellowpay payment methods default settings: // Accepted payment methods $query = "\n SELECT 1 FROM `{$table_name}`\n WHERE name='yellowpay_accepted_payment_methods'"; $objResult = $objDatabase->Execute($query); if ($objResult) { if ($objResult->RecordCount() == 0) { $query = "\n INSERT INTO `{$table_name}` (\n `id`, `name`, `value`, `status`\n ) VALUES (\n NULL, 'yellowpay_accepted_payment_methods', '', '1'\n )"; $objResult = $objDatabase->Execute($query); if ($objResult) { } else { return _databaseError($query, $objDatabase->ErrorMsg()); } } } else { return _databaseError($query, $objDatabase->ErrorMsg()); } // Change old yellowpay_delivery_payment_type setting // to new yellowpay_authorization_type $query = "\n SELECT 1 FROM `{$table_name}`\n WHERE `name`='yellowpay_delivery_payment_type'"; $objResult = $objDatabase->Execute($query); if ($objResult) { if ($objResult->RecordCount() == 1) { $query = "\n UPDATE `{$table_name}`\n SET `name`='yellowpay_authorization_type'\n WHERE `name`='yellowpay_delivery_payment_type'"; $objResult = $objDatabase->Execute($query); if ($objResult) { } else { return _databaseError($query, $objDatabase->ErrorMsg()); } } } else { return _databaseError($query, $objDatabase->ErrorMsg()); } // Add yellowpay test server flag setting $query = "\n SELECT 1 FROM `{$table_name}`\n WHERE `name`='yellowpay_use_testserver'"; $objResult = $objDatabase->Execute($query); if ($objResult) { if ($objResult->RecordCount() == 0) { $query = "\n INSERT INTO `{$table_name}` (\n `id`, `name`, `value`, `status`\n ) VALUES (\n NULL, 'yellowpay_use_testserver', '1', '1'\n )"; $objResult = $objDatabase->Execute($query); if ($objResult) { } else { return _databaseError($query, $objDatabase->ErrorMsg()); } } } else { return _databaseError($query, $objDatabase->ErrorMsg()); } // Add weight enable flag setting $query = "\n SELECT 1 FROM `{$table_name}`\n WHERE `name`='shop_weight_enable'"; $objResult = $objDatabase->Execute($query); if ($objResult) { if ($objResult->RecordCount() == 0) { $query = "\n INSERT INTO `{$table_name}` (\n `id`, `name`, `value`, `status`\n ) VALUES (\n NULL, 'shop_weight_enable', '1', '1'\n )"; $objResult = $objDatabase->Execute($query); if ($objResult) { } else { return _databaseError($query, $objDatabase->ErrorMsg()); } } } else { return _databaseError($query, $objDatabase->ErrorMsg()); } // Add shop_show_products_default: // Which products are shown on the first shop page? $query = "\n SELECT 1 FROM `{$table_name}`\n WHERE `name`='shop_show_products_default'"; $objResult = $objDatabase->Execute($query); if (!$objResult) { return _databaseError($query, $objDatabase->ErrorMsg()); } if ($objResult->RecordCount() == 0) { $query = "\n INSERT INTO `{$table_name}` (\n `name`, `value`\n ) VALUES (\n 'shop_show_products_default', '1'\n )"; $objResult = $objDatabase->Execute($query); if (!$objResult) { return _databaseError($query, $objDatabase->ErrorMsg()); } } // Update VAT settings $query = "\n SELECT `value` FROM `{$table_name}`\n WHERE `name`='tax_enabled'"; $objResult = $objDatabase->Execute($query); if (!$objResult) { return _databaseError($query, $objDatabase->ErrorMsg()); } if ($objResult->RecordCount()) { $flagVatEnabled = $objResult->fields['value']; $arrVatEnabled = array('vat_enabled_foreign_customer', 'vat_enabled_foreign_reseller', 'vat_enabled_home_customer', 'vat_enabled_home_reseller'); foreach ($arrVatEnabled as $strSetting) { $query = "\n SELECT 1 FROM `{$table_name}`\n WHERE `name`='{$strSetting}'"; $objResult = $objDatabase->Execute($query); if (!$objResult) { return _databaseError($query, $objDatabase->ErrorMsg()); } if ($objResult->RecordCount() == 0) { $query = "\n INSERT INTO `{$table_name}` (\n `name`, `value`\n ) VALUES (\n '{$strSetting}', '{$flagVatEnabled}'\n )"; $objResult = $objDatabase->Execute($query); if (!$objResult) { return _databaseError($query, $objDatabase->ErrorMsg()); } } } } $query = "\n SELECT `value` FROM `{$table_name}`\n WHERE `name`='tax_included'"; $objResult = $objDatabase->Execute($query); if (!$objResult) { return _databaseError($query, $objDatabase->ErrorMsg()); } if ($objResult->RecordCount()) { $flagVatIncluded = $objResult->fields['value']; $arrVatIncluded = array('vat_included_foreign_customer', 'vat_included_foreign_reseller', 'vat_included_home_customer', 'vat_included_home_reseller'); foreach ($arrVatIncluded as $strSetting) { $query = "\n SELECT 1 FROM `{$table_name}`\n WHERE `name`='{$strSetting}'"; $objResult = $objDatabase->Execute($query); if (!$objResult) { return _databaseError($query, $objDatabase->ErrorMsg()); } if ($objResult->RecordCount() == 0) { $query = "\n INSERT INTO `{$table_name}` (\n `name`, `value`\n ) VALUES (\n '{$strSetting}', '{$flagVatIncluded}'\n )"; $objResult = $objDatabase->Execute($query); if (!$objResult) { return _databaseError($query, $objDatabase->ErrorMsg()); } } } } $query = "\n DELETE FROM `{$table_name}`\n WHERE `name`='tax_enabled' OR `name`='tax_included'"; $objResult = $objDatabase->Execute($query); if (!$objResult) { return _databaseError($query, $objDatabase->ErrorMsg()); } } // Update Attribute price to signed. // price_prefix is removed for version 3. See Attribute::errorHandler() $table_name = DBPREFIX . 'module_shop_products_attributes_value'; if (Cx\Lib\UpdateUtil::table_exist($table_name) && Cx\Lib\UpdateUtil::column_exist($table_name, 'price_prefix') && Cx\Lib\UpdateUtil::table_exist(DBPREFIX . 'module_shop_order_items_attributes') && Cx\Lib\UpdateUtil::column_exist(DBPREFIX . 'module_shop_order_items_attributes', 'price_prefix')) { $query = "\n UPDATE `{$table_name}`\n SET `price`=-`price`,\n `price_prefix`='+'\n WHERE `price`>0\n AND `price_prefix`='-'"; $objResult = $objDatabase->Execute($query); if (!$objResult) { return _databaseError($query, $objDatabase->ErrorMsg()); } $query = "\n UPDATE `" . DBPREFIX . "module_shop_order_items_attributes`\n SET `product_option_values_price`=-`product_option_values_price`\n WHERE `product_option_values_price`>0\n AND `price_prefix`='-'"; $objResult = $objDatabase->Execute($query); if (!$objResult) { return _databaseError($query, $objDatabase->ErrorMsg()); } } // Update tables' field types and indices $table_name = DBPREFIX . 'module_shop_article_group'; if (Cx\Lib\UpdateUtil::table_exist($table_name) && Cx\Lib\UpdateUtil::column_exist($table_name, 'name')) { Cx\Lib\UpdateUtil::table($table_name, array('id' => array('type' => 'INT(10)', 'unsigned' => true, 'notnull' => true, 'primary' => true, 'auto_increment' => true), 'name' => array('type' => 'VARCHAR(255)', 'notnull' => true, 'default' => '', 'renamefrom' => 'name'))); } $table_name = DBPREFIX . 'module_shop_customer_group'; if (Cx\Lib\UpdateUtil::table_exist($table_name) && Cx\Lib\UpdateUtil::column_exist($table_name, 'name')) { Cx\Lib\UpdateUtil::table($table_name, array('id' => array('type' => 'INT(10)', 'unsigned' => true, 'notnull' => true, 'primary' => true, 'auto_increment' => true), 'name' => array('type' => 'VARCHAR(255)', 'notnull' => true, 'default' => ''))); } $table_name = DBPREFIX . 'module_shop_discountgroup_count_name'; if (Cx\Lib\UpdateUtil::table_exist($table_name) && Cx\Lib\UpdateUtil::column_exist($table_name, 'name')) { Cx\Lib\UpdateUtil::table($table_name, array('id' => array('type' => 'INT(10)', 'unsigned' => true, 'notnull' => true, 'primary' => true, 'auto_increment' => true), 'name' => array('type' => 'VARCHAR(255)', 'notnull' => true, 'default' => ''), 'unit' => array('type' => 'VARCHAR(255)', 'notnull' => true, 'default' => ''))); } $table_name = DBPREFIX . 'module_shop_discountgroup_count_rate'; if (Cx\Lib\UpdateUtil::table_exist($table_name)) { Cx\Lib\UpdateUtil::table($table_name, array('group_id' => array('type' => 'INT(10) UNSIGNED', 'notnull' => true, 'primary' => true, 'default' => 0), 'count' => array('type' => 'INT(10) UNSIGNED', 'notnull' => true, 'primary' => true, 'default' => '1'), 'rate' => array('type' => 'DECIMAL(5,2)', 'unsigned' => true, 'notnull' => true, 'default' => '0.0'))); } $table_name = DBPREFIX . 'module_shop_rel_discount_group'; if (Cx\Lib\UpdateUtil::table_exist($table_name)) { Cx\Lib\UpdateUtil::table($table_name, array('customer_group_id' => array('type' => 'INT(10) UNSIGNED', 'notnull' => true, 'primary' => true, 'default' => '0'), 'article_group_id' => array('type' => 'INT(10) UNSIGNED', 'notnull' => true, 'primary' => true, 'default' => '0'), 'rate' => array('type' => 'DECIMAL(9,2)', 'notnull' => true, 'default' => '0.0'))); } $table_name = DBPREFIX . 'module_shop_lsv'; if (Cx\Lib\UpdateUtil::table_exist($table_name)) { Cx\Lib\UpdateUtil::table($table_name, array('id' => array('type' => 'INT(10)', 'unsigned' => true, 'notnull' => true, 'auto_increment' => true, 'primary' => true, 'renamefrom' => 'order_id'), 'order_id' => array('type' => 'INT(10)', 'unsigned' => true, 'notnull' => true, 'default' => '0'), 'holder' => array('type' => 'TINYTEXT'), 'bank' => array('type' => 'TINYTEXT'), 'blz' => array('type' => 'TINYTEXT')), array('order_id' => array('fields' => array('order_id'), 'type' => 'UNIQUE'))); } $table_name = DBPREFIX . 'module_shop_shipment_cost'; if (Cx\Lib\UpdateUtil::table_exist($table_name) && Cx\Lib\UpdateUtil::column_exist($table_name, 'price_free')) { Cx\Lib\UpdateUtil::table($table_name, array('id' => array('type' => 'INT(10)', 'unsigned' => true, 'notnull' => true, 'auto_increment' => true, 'primary' => true), 'shipper_id' => array('type' => 'INT(10)', 'unsigned' => true, 'notnull' => true, 'default' => '0'), 'max_weight' => array('type' => 'INT(10)', 'unsigned' => true, 'notnull' => false), 'cost' => array('type' => 'DECIMAL(10,2)', 'unsigned' => true, 'notnull' => false), 'price_free' => array('type' => 'DECIMAL(10,2)', 'unsigned' => true, 'notnull' => false))); } $table_name = DBPREFIX . 'module_shop_shipper'; if (Cx\Lib\UpdateUtil::table_exist($table_name) && Cx\Lib\UpdateUtil::column_exist($table_name, 'name')) { Cx\Lib\UpdateUtil::table($table_name, array('id' => array('type' => 'INT(10)', 'unsigned' => true, 'notnull' => true, 'auto_increment' => true, 'primary' => true), 'name' => array('type' => 'TINYTEXT'), 'status' => array('type' => 'TINYINT(1)', 'unsigned' => true, 'notnull' => true, 'default' => '0'))); } // Note that countries are migrated to the core_countries table // for version 3, and this table is then dropped. // See Country::errorHandler() $table_name = DBPREFIX . 'module_shop_countries'; if (Cx\Lib\UpdateUtil::table_exist($table_name)) { Cx\Lib\UpdateUtil::table($table_name, array('countries_id' => array('type' => 'INT(10)', 'unsigned' => true, 'notnull' => true, 'primary' => true, 'auto_increment' => true), 'countries_name' => array('type' => 'VARCHAR(64)', 'notnull' => true, 'default' => ''), 'countries_iso_code_2' => array('type' => 'CHAR(2)', 'notnull' => true, 'default' => ''), 'countries_iso_code_3' => array('type' => 'CHAR(3)', 'notnull' => true, 'default' => ''), 'activation_status' => array('type' => 'TINYINT(1)', 'unsigned' => true, 'notnull' => true, 'default' => '1')), array('countries_name' => array('fields' => array('countries_name')))); } // Add Category description to old table version with "catid" // primary key only! Fulltext indices are added when migrating // to core_text anyway, so don't bother with text fields here. $table_name = DBPREFIX . 'module_shop_categories'; if (Cx\Lib\UpdateUtil::table_exist($table_name) && Cx\Lib\UpdateUtil::column_exist($table_name, 'catid')) { Cx\Lib\UpdateUtil::table($table_name, array('catid' => array('type' => 'INT(10)', 'unsigned' => true, 'notnull' => true, 'primary' => true, 'auto_increment' => true), 'parentid' => array('type' => 'INT(10)', 'unsigned' => true, 'notnull' => true, 'default' => '0'), 'catname' => array('type' => 'VARCHAR(255)', 'notnull' => true, 'default' => ''), 'catdesc' => array('type' => 'TEXT', 'notnull' => true, 'default' => ''), 'catsorting' => array('type' => 'INT(10)', 'unsigned' => true, 'notnull' => true, 'default' => '100'), 'catstatus' => array('type' => 'TINYINT(1)', 'unsigned' => true, 'notnull' => true, 'default' => '1'), 'picture' => array('type' => 'VARCHAR(255)', 'notnull' => true, 'default' => ''), 'flags' => array('type' => 'VARCHAR(255)', 'notnull' => true, 'default' => '')), array('flags' => array('fields' => array('flags'), 'type' => 'FULLTEXT'))); } // Settings table fields -- this is supposed to exist; see above /* $table_name = DBPREFIX.'module_shop_config'; if (Cx\Lib\UpdateUtil::table_exist($table_name)) { Cx\Lib\UpdateUtil::table($table_name, array( 'id' => array('type' => 'INT(10)', 'unsigned' => true, 'notnull' => true, 'primary' => true, 'auto_increment' => true), 'name' => array('type' => 'VARCHAR(64)', 'notnull' => true, 'default' => ''), 'value' => array('type' => 'VARCHAR(255)', 'notnull', 'default' => ''), 'status' => array('type' => 'TINYINT(1)', 'unsigned' => true, 'notnull' => true, 'default' => '1'), ) ); }*/ $table_name = DBPREFIX . 'module_shop_currencies'; if (Cx\Lib\UpdateUtil::table_exist($table_name) && Cx\Lib\UpdateUtil::column_exist($table_name, 'name')) { $query = "\n UPDATE `{$table_name}`\n SET sort_order = 0 WHERE sort_order IS NULL"; Cx\Lib\UpdateUtil::sql($query); // Currencies table fields Cx\Lib\UpdateUtil::table($table_name, array('id' => array('type' => 'INT(10)', 'unsigned' => true, 'notnull' => true, 'auto_increment' => true, 'primary' => true), 'code' => array('type' => 'CHAR(3)', 'notnull' => true, 'default' => ''), 'symbol' => array('type' => 'VARCHAR(20)', 'notnull' => true, 'default' => ''), 'name' => array('type' => 'VARCHAR(50)', 'notnull' => true, 'default' => ''), 'rate' => array('type' => 'DECIMAL(10,4)', 'unsigned' => true, 'notnull' => true, 'default' => '1.0000'), 'sort_order' => array('type' => 'INT(5)', 'unsigned' => true, 'notnull' => true, 'default' => '0'), 'status' => array('type' => 'TINYINT(1)', 'unsigned' => true, 'notnull' => true, 'default' => '1'), 'is_default' => array('type' => 'TINYINT(1)', 'unsigned' => true, 'notnull' => true, 'default' => '0'))); } // Note that this table is migrated to access_users for version 3, // then dropped. $table_name = DBPREFIX . 'module_shop_customers'; if (Cx\Lib\UpdateUtil::table_exist($table_name)) { Cx\Lib\UpdateUtil::table($table_name, array('customerid' => array('type' => 'INT(10)', 'unsigned' => true, 'notnull' => true, 'auto_increment' => true, 'primary' => true), 'username' => array('type' => 'VARCHAR(255)', 'notnull' => true, 'default' => ''), 'password' => array('type' => 'VARCHAR(32)', 'notnull' => true, 'default' => ''), 'prefix' => array('type' => 'VARCHAR(50)', 'notnull' => true, 'default' => ''), 'company' => array('type' => 'VARCHAR(100)', 'notnull' => true, 'default' => ''), 'firstname' => array('type' => 'VARCHAR(50)', 'notnull' => true, 'default' => ''), 'lastname' => array('type' => 'VARCHAR(100)', 'notnull' => true, 'default' => ''), 'address' => array('type' => 'VARCHAR(40)', 'notnull' => true, 'default' => ''), 'city' => array('type' => 'VARCHAR(20)', 'notnull' => true, 'default' => ''), 'zip' => array('type' => 'VARCHAR(10)', 'notnull' => false), 'country_id' => array('type' => 'INT(10)', 'unsigned' => true, 'notnull' => false), 'phone' => array('type' => 'VARCHAR(20)', 'notnull' => true, 'default' => ''), 'fax' => array('type' => 'VARCHAR(25)', 'notnull' => true, 'default' => ''), 'email' => array('type' => 'VARCHAR(255)', 'notnull' => true, 'default' => ''), 'ccnumber' => array('type' => 'VARCHAR(100)', 'notnull' => true, 'default' => ''), 'ccdate' => array('type' => 'VARCHAR(10)', 'notnull' => true, 'default' => ''), 'ccname' => array('type' => 'VARCHAR(100)', 'notnull' => true, 'default' => ''), 'cvc_code' => array('type' => 'VARCHAR(5)', 'notnull' => true, 'default' => ''), 'company_note' => array('type' => 'TEXT', 'notnull' => true), 'is_reseller' => array('type' => 'TINYINT(1)', 'unsigned' => true, 'notnull' => true, 'default' => '0'), 'register_date' => array('type' => 'DATETIME', 'notnull' => true, 'default' => '0000-00-00 00:00:00'), 'customer_status' => array('type' => 'TINYINT(1)', 'unsigned' => true, 'notnull' => true, 'default' => '0'), 'group_id' => array('type' => 'INT(10)', 'unsigned' => true, 'notnull' => false))); } $table_name = DBPREFIX . 'module_shop_importimg'; if (Cx\Lib\UpdateUtil::table_exist($table_name)) { Cx\Lib\UpdateUtil::table($table_name, array('img_id' => array('type' => 'INT(10) UNSIGNED', 'notnull' => true, 'primary' => true, 'auto_increment' => true), 'img_name' => array('type' => 'VARCHAR(255)', 'notnull' => true, 'default' => ''), 'img_cats' => array('type' => 'TEXT', 'notnull' => true, 'default' => ''), 'img_fields_file' => array('type' => 'TEXT', 'notnull' => true, 'default' => ''), 'img_fields_db' => array('type' => 'VARCHAR(255)', 'notnull' => true, 'default' => ''))); } // Note that the following two tables are migrated to MailTemplate // for version 3, then dropped. $table_name = DBPREFIX . 'module_shop_mail'; if (Cx\Lib\UpdateUtil::table_exist($table_name)) { Cx\Lib\UpdateUtil::table($table_name, array('id' => array('type' => 'INT(10)', 'unsigned' => true, 'notnull' => true, 'auto_increment' => true, 'primary' => true), 'tplname' => array('type' => 'VARCHAR(60)', 'notnull' => true, 'default' => ''), 'protected' => array('type' => 'TINYINT(1)', 'unsigned' => true, 'notnull' => true, 'default' => '0'))); } $table_name = DBPREFIX . 'module_shop_mail_content'; if (Cx\Lib\UpdateUtil::table_exist($table_name)) { Cx\Lib\UpdateUtil::table($table_name, array('id' => array('type' => 'INT(10)', 'unsigned' => true, 'notnull' => true, 'auto_increment' => true, 'primary' => true), 'tpl_id' => array('type' => 'INT(10)', 'unsigned' => true, 'notnull' => true, 'default' => '0'), 'lang_id' => array('type' => 'INT(10)', 'unsigned' => true, 'notnull' => true, 'default' => '0'), 'from_mail' => array('type' => 'VARCHAR(255)', 'notnull' => true, 'default' => ''), 'xsender' => array('type' => 'VARCHAR(255)', 'notnull' => true, 'default' => ''), 'subject' => array('type' => 'VARCHAR(255)', 'notnull' => true, 'default' => ''), 'message' => array('type' => 'TEXT', 'notnull' => true))); } // Note: No changes necessary; the manufacturer table will be // completely modified in Manufacturer::errorHandler() below. /* $table_name = DBPREFIX.'module_shop_manufacturer'; if ( Cx\Lib\UpdateUtil::table_exist($table_name) && Cx\Lib\UpdateUtil::column_exist($table_name, 'name')) { Cx\Lib\UpdateUtil::table($table_name, DBPREFIX.'', array( 'id' => array('type' => 'INT(10)', 'unsigned' => true, 'notnull' => true, 'auto_increment' => true, 'primary' => true), 'name' => array('type' => 'VARCHAR(255)', 'notnull' => true, 'default' => ''), 'url' => array('type' => 'VARCHAR(255)', 'notnull' => true, 'default' => ''), ) ); }*/ $table_name = DBPREFIX . 'module_shop_order_items'; if (Cx\Lib\UpdateUtil::table_exist($table_name) && Cx\Lib\UpdateUtil::column_exist($table_name, 'order_items_id')) { Cx\Lib\UpdateUtil::table($table_name, array('order_items_id' => array('type' => 'INT(10)', 'unsigned' => true, 'notnull' => true, 'auto_increment' => true, 'primary' => true), 'orderid' => array('type' => 'INT(10)', 'unsigned' => true, 'notnull' => true, 'default' => '0'), 'productid' => array('type' => 'VARCHAR(100)', 'notnull' => true, 'default' => ''), 'product_name' => array('type' => 'VARCHAR(100)', 'notnull' => true, 'default' => ''), 'price' => array('type' => 'DECIMAL(9,2)', 'notnull' => true, 'default' => '0.00'), 'quantity' => array('type' => 'INT(10)', 'unsigned' => true, 'notnull' => true, 'default' => '1'), 'vat_percent' => array('type' => 'DECIMAL(5,2)', 'unsigned' => true, 'notnull' => false), 'weight' => array('type' => 'INT(10)', 'unsigned' => true, 'notnull' => false))); } // Note: Removed field price_prefix for version 2.2; no changes since $table_name = DBPREFIX . 'module_shop_order_items_attributes'; if (Cx\Lib\UpdateUtil::table_exist($table_name) && Cx\Lib\UpdateUtil::column_exist($table_name, 'price_prefix')) { Cx\Lib\UpdateUtil::table($table_name, array('orders_items_attributes_id' => array('type' => 'INT(10)', 'unsigned' => true, 'notnull' => true, 'auto_increment' => true, 'primary' => true), 'order_items_id' => array('type' => 'INT(10)', 'unsigned' => true, 'notnull' => true, 'default' => '0'), 'order_id' => array('type' => 'INT(10)', 'unsigned' => true, 'notnull' => true, 'default' => '0'), 'product_id' => array('type' => 'INT(10)', 'unsigned' => true, 'notnull' => true, 'default' => '0'), 'product_option_name' => array('type' => 'VARCHAR(32)', 'notnull' => true, 'default' => ''), 'product_option_value' => array('type' => 'VARCHAR(32)', 'notnull' => true, 'default' => ''), 'product_option_values_price' => array('type' => 'DECIMAL(9,2)', 'notnull' => true, 'default' => '0.00'))); } $table_name = DBPREFIX . 'module_shop_orders'; if (Cx\Lib\UpdateUtil::table_exist($table_name) && Cx\Lib\UpdateUtil::column_exist($table_name, 'orderid')) { Cx\Lib\UpdateUtil::table($table_name, array('orderid' => array('type' => 'INT(10)', 'unsigned' => true, 'notnull' => true, 'auto_increment' => true, 'primary' => true), 'customerid' => array('type' => 'INT(10)', 'unsigned' => true, 'notnull' => true, 'default' => '0'), 'selected_currency_id' => array('type' => 'INT(10)', 'unsigned' => true, 'notnull' => true, 'default' => '0'), 'order_sum' => array('type' => 'DECIMAL(9,2)', 'notnull' => true, 'default' => '0.00'), 'currency_order_sum' => array('type' => 'DECIMAL(9,2)', 'notnull' => true, 'default' => '0.00'), 'order_date' => array('type' => 'DATETIME', 'notnull' => true, 'default' => '0000-00-00 00:00:00'), 'order_status' => array('type' => 'TINYINT(1)', 'unsigned' => true, 'notnull' => true, 'default' => '0'), 'ship_prefix' => array('type' => 'VARCHAR(50)', 'notnull' => true, 'default' => ''), 'ship_company' => array('type' => 'VARCHAR(100)', 'notnull' => true, 'default' => ''), 'ship_firstname' => array('type' => 'VARCHAR(40)', 'notnull' => true, 'default' => ''), 'ship_lastname' => array('type' => 'VARCHAR(100)', 'notnull' => true, 'default' => ''), 'ship_address' => array('type' => 'VARCHAR(40)', 'notnull' => true, 'default' => ''), 'ship_city' => array('type' => 'VARCHAR(20)', 'notnull' => true, 'default' => ''), 'ship_zip' => array('type' => 'VARCHAR(10)', 'notnull' => false), 'ship_country_id' => array('type' => 'INT(10)', 'unsigned' => true, 'notnull' => false), 'ship_phone' => array('type' => 'VARCHAR(20)', 'notnull' => true, 'default' => ''), 'tax_price' => array('type' => 'DECIMAL(9,2)', 'notnull' => true, 'default' => '0.00'), 'currency_ship_price' => array('type' => 'DECIMAL(9,2)', 'notnull' => true, 'default' => '0.00'), 'shipping_id' => array('type' => 'INT(10)', 'unsigned' => true, 'notnull' => false), 'payment_id' => array('type' => 'INT(10)', 'unsigned' => true, 'notnull' => false), 'currency_payment_price' => array('type' => 'DECIMAL(9,2)', 'notnull' => true, 'default' => '0.00'), 'customer_ip' => array('type' => 'VARCHAR(50)', 'notnull' => true, 'default' => ''), 'customer_host' => array('type' => 'VARCHAR(100)', 'notnull' => true, 'default' => ''), 'customer_lang' => array('type' => 'VARCHAR(255)', 'notnull' => true, 'default' => ''), 'customer_browser' => array('type' => 'VARCHAR(100)', 'notnull' => true, 'default' => ''), 'customer_note' => array('type' => 'TEXT'), 'last_modified' => array('type' => 'DATETIME', 'notnull' => true, 'default' => '0000-00-00 00:00:00'), 'modified_by' => array('type' => 'VARCHAR(50)', 'notnull' => true, 'default' => '')), array('order_status' => array('fields' => array('order_status')))); } $table_name = DBPREFIX . 'module_shop_payment'; if (Cx\Lib\UpdateUtil::table_exist($table_name) && Cx\Lib\UpdateUtil::column_exist($table_name, 'name')) { Cx\Lib\UpdateUtil::table($table_name, array('id' => array('type' => 'INT(10)', 'unsigned' => true, 'notnull' => true, 'auto_increment' => true, 'primary' => true), 'name' => array('type' => 'VARCHAR(50)', 'notnull' => false), 'processor_id' => array('type' => 'INT(10)', 'unsigned' => true, 'notnull' => true, 'default' => '0'), 'costs' => array('type' => 'DECIMAL(9,2)', 'notnull' => true, 'default' => '0.00'), 'costs_free_sum' => array('type' => 'DECIMAL(9,2)', 'notnull' => true, 'default' => '0.00'), 'sort_order' => array('type' => 'INT(5)', 'unsigned' => true, 'notnull' => false, 'default' => '0'), 'status' => array('type' => 'TINYINT(1)', 'unsigned' => true, 'notnull' => false, 'default' => '1'))); } // Note: No changes (still single language in version 3) $table_name = DBPREFIX . 'module_shop_payment_processors'; Cx\Lib\UpdateUtil::table($table_name, array('id' => array('type' => 'INT(10)', 'unsigned' => true, 'notnull' => true, 'auto_increment' => true, 'primary' => true), 'type' => array('type' => 'ENUM(\'internal\',\'external\')', 'notnull' => true, 'default' => 'internal'), 'name' => array('type' => 'VARCHAR(100)', 'notnull' => true, 'default' => ''), 'description' => array('type' => 'TEXT'), 'company_url' => array('type' => 'VARCHAR(255)', 'notnull' => true, 'default' => ''), 'status' => array('type' => 'TINYINT(1)', 'unsigned' => true, 'notnull' => false, 'default' => '1'), 'picture' => array('type' => 'VARCHAR(100)', 'notnull' => true, 'default' => ''))); Cx\Lib\UpdateUtil::sql(' INSERT IGNORE INTO `' . DBPREFIX . 'module_shop_payment_processors` (`id`, `type`, `name`, `description`, `company_url`, `status`, `picture`) VALUES (12,"external","paymill_cc","","https://www.paymill.com",1,""), (13,"external","paymill_elv","","https://www.paymill.com",1,""), (14,"external","paymill_iban","","https://www.paymill.com",1,"") '); // Note: No changes (still single language in version 3) $table_name = DBPREFIX . 'module_shop_pricelists'; if (Cx\Lib\UpdateUtil::table_exist($table_name)) { Cx\Lib\UpdateUtil::table($table_name, array('id' => array('type' => 'INT(10)', 'unsigned' => true, 'notnull' => true, 'auto_increment' => true, 'primary' => true), 'name' => array('type' => 'VARCHAR(25)', 'notnull' => true, 'default' => ''), 'lang_id' => array('type' => 'INT(10)', 'unsigned' => true, 'notnull' => true, 'default' => '0'), 'border_on' => array('type' => 'TINYINT(1)', 'unsigned' => true, 'notnull' => true, 'default' => '1'), 'header_on' => array('type' => 'TINYINT(1)', 'unsigned' => true, 'notnull' => true, 'default' => '1'), 'header_left' => array('type' => 'TEXT', 'notnull' => false), 'header_right' => array('type' => 'TEXT', 'notnull' => false), 'footer_on' => array('type' => 'TINYINT(1)', 'unsigned' => true, 'notnull' => true, 'default' => '0'), 'footer_left' => array('type' => 'TEXT', 'notnull' => false), 'footer_right' => array('type' => 'TEXT', 'notnull' => false), 'categories' => array('type' => 'TEXT'))); } $table_name = DBPREFIX . 'module_shop_products'; if (Cx\Lib\UpdateUtil::table_exist($table_name) && Cx\Lib\UpdateUtil::column_exist($table_name, 'title')) { $query = "\n UPDATE `{$table_name}`\n SET `description`=''\n WHERE `description` IS NULL"; if ($objDatabase->Execute($query) == false) { return _databaseError($query, $objDatabase->ErrorMsg()); } Cx\Lib\UpdateUtil::table($table_name, array('id' => array('type' => 'INT(10)', 'unsigned' => true, 'notnull' => true, 'auto_increment' => true, 'primary' => true), 'product_id' => array('type' => 'VARCHAR(100)'), 'picture' => array('type' => 'TEXT'), 'title' => array('type' => 'VARCHAR(255)', 'notnull' => true, 'default' => ''), 'catid' => array('type' => 'INT(10)', 'unsigned' => true, 'notnull' => true, 'default' => '1'), 'handler' => array('type' => 'ENUM(\'none\',\'delivery\',\'download\')', 'notnull' => true, 'default' => 'delivery'), 'normalprice' => array('type' => 'DECIMAL(9,2)', 'notnull' => true, 'default' => '0.00'), 'resellerprice' => array('type' => 'DECIMAL(9,2)', 'notnull' => true, 'default' => '0.00'), 'shortdesc' => array('type' => 'TEXT'), 'description' => array('type' => 'TEXT'), 'stock' => array('type' => 'INT(10)', 'notnull' => true, 'default' => '10'), 'stock_visibility' => array('type' => 'TINYINT(1)', 'unsigned' => true, 'notnull' => true, 'default' => '1'), 'discountprice' => array('type' => 'DECIMAL(9,2)', 'notnull' => true, 'default' => '0.00'), 'is_special_offer' => array('type' => 'TINYINT(1)', 'unsigned' => true, 'notnull' => true, 'default' => '0'), 'property1' => array('type' => 'VARCHAR(100)', 'notnull' => false, 'default' => ''), 'property2' => array('type' => 'VARCHAR(100)', 'notnull' => false, 'default' => ''), 'status' => array('type' => 'TINYINT(1)', 'unsigned' => true, 'notnull' => true, 'default' => '1'), 'b2b' => array('type' => 'TINYINT(1)', 'unsigned' => true, 'notnull' => true, 'default' => '1'), 'b2c' => array('type' => 'TINYINT(1)', 'unsigned' => true, 'notnull' => true, 'default' => '1'), 'startdate' => array('type' => 'DATETIME', 'notnull' => true, 'default' => '0000-00-00 00:00:00'), 'enddate' => array('type' => 'DATETIME', 'notnull' => true, 'default' => '0000-00-00 00:00:00'), 'thumbnail_percent' => array('type' => 'TINYINT(2)', 'unsigned' => true, 'notnull' => true, 'default' => '0'), 'thumbnail_quality' => array('type' => 'TINYINT(2)', 'unsigned' => true, 'notnull' => true, 'default' => '0'), 'manufacturer' => array('type' => 'INT(10)', 'unsigned' => true, 'notnull' => true, 'default' => '0'), 'manufacturer_url' => array('type' => 'VARCHAR(255)', 'notnull' => true, 'default' => ''), 'external_link' => array('type' => 'VARCHAR(255)', 'notnull' => true, 'default' => ''), 'sort_order' => array('type' => 'INT(5)', 'unsigned' => true, 'notnull' => true, 'default' => '0'), 'vat_id' => array('type' => 'INT(10)', 'unsigned' => true, 'notnull' => false), 'weight' => array('type' => 'INT(10)', 'unsigned' => true, 'notnull' => false), 'flags' => array('type' => 'VARCHAR(255)', 'notnull' => true, 'default' => ''), 'usergroups' => array('type' => 'VARCHAR(255)', 'notnull' => true, 'default' => ''), 'group_id' => array('type' => 'INT(10)', 'unsigned' => true, 'notnull' => false), 'article_id' => array('type' => 'INT(10)', 'unsigned' => true, 'notnull' => false), 'keywords' => array('type' => 'TEXT')), array('group_id' => array('fields' => array('group_id')), 'article_id' => array('fields' => array('article_id')), 'shopindex' => array('fields' => array('title', 'description'), 'type' => 'FULLTEXT'), 'flags' => array('fields' => array('flags'), 'type' => 'FULLTEXT'), 'keywords' => array('fields' => array('keywords'), 'type' => 'FULLTEXT'))); } // Note: The following three tables are renamed for version 3. // See Attribute::errorHandler() $table_name = DBPREFIX . 'module_shop_products_attributes'; if (Cx\Lib\UpdateUtil::table_exist($table_name)) { Cx\Lib\UpdateUtil::table($table_name, array('attribute_id' => array('type' => 'INT(10)', 'unsigned' => true, 'notnull' => true, 'auto_increment' => true, 'primary' => true), 'product_id' => array('type' => 'INT(10)', 'unsigned' => true, 'notnull' => true, 'default' => '0'), 'attributes_name_id' => array('type' => 'INT(10)', 'unsigned' => true, 'notnull' => true, 'default' => '0'), 'attributes_value_id' => array('type' => 'INT(10)', 'unsigned' => true, 'notnull' => true, 'default' => '0'), 'sort_id' => array('type' => 'INT(5)', 'unsigned' => true, 'notnull' => true, 'default' => '0'))); } $table_name = DBPREFIX . 'module_shop_products_attributes_name'; if (Cx\Lib\UpdateUtil::table_exist($table_name)) { Cx\Lib\UpdateUtil::table($table_name, array('id' => array('type' => 'INT(10)', 'unsigned' => true, 'notnull' => true, 'auto_increment' => true, 'primary' => true), 'name' => array('type' => 'VARCHAR(255)', 'notnull' => true, 'default' => ''), 'display_type' => array('type' => 'TINYINT(3)', 'unsigned' => true, 'notnull' => true, 'default' => '0'))); } $table_name = DBPREFIX . 'module_shop_products_attributes_value'; if (Cx\Lib\UpdateUtil::table_exist($table_name)) { Cx\Lib\UpdateUtil::table($table_name, array('id' => array('type' => 'INT(10)', 'unsigned' => true, 'notnull' => true, 'auto_increment' => true, 'primary' => true), 'name_id' => array('type' => 'INT(10)', 'unsigned' => true, 'notnull' => true, 'default' => '0'), 'value' => array('type' => 'VARCHAR(255)', 'notnull' => true, 'default' => ''), 'price' => array('type' => 'DECIMAL(9,2)', 'notnull' => false, 'default' => '0.00'))); } // Note: Obsolete for a while already $table_name = DBPREFIX . 'module_shop_products_downloads'; if (Cx\Lib\UpdateUtil::table_exist($table_name)) { Cx\Lib\UpdateUtil::drop_table($table_name); } // Note: The id field is removed for version 3 from the following // three tables $table_name = DBPREFIX . 'module_shop_rel_countries'; if (Cx\Lib\UpdateUtil::table_exist($table_name) && Cx\Lib\UpdateUtil::column_exist($table_name, 'id')) { Cx\Lib\UpdateUtil::table($table_name, array('id' => array('type' => 'INT(10)', 'unsigned' => true, 'notnull' => true, 'auto_increment' => true, 'primary' => true), 'zones_id' => array('type' => 'INT(10)', 'unsigned' => true, 'notnull' => true, 'default' => '0'), 'countries_id' => array('type' => 'INT(10)', 'unsigned' => true, 'notnull' => true, 'default' => '0'))); } $table_name = DBPREFIX . 'module_shop_rel_payment'; Cx\Lib\UpdateUtil::table($table_name, array('id' => array('type' => 'INT(10)', 'unsigned' => true, 'notnull' => true, 'auto_increment' => true, 'primary' => true), 'zones_id' => array('type' => 'INT(10)', 'unsigned' => true, 'notnull' => true, 'default' => '0'), 'payment_id' => array('type' => 'INT(10)', 'unsigned' => true, 'notnull' => true, 'default' => '0'))); Cx\Lib\UpdateUtil::sql(' INSERT IGNORE INTO `' . DBPREFIX . 'module_shop_rel_payment` (`zones_id`, `payment_id`) VALUES (1,16), (1,17), (1,18) '); // Note: This is renamed to module_shop_rel_shipper for version 3.0 $table_name = DBPREFIX . 'module_shop_rel_shipment'; if (Cx\Lib\UpdateUtil::table_exist($table_name) && Cx\Lib\UpdateUtil::column_exist($table_name, 'id')) { Cx\Lib\UpdateUtil::table($table_name, array('id' => array('type' => 'INT(10)', 'unsigned' => true, 'notnull' => true, 'auto_increment' => true, 'primary' => true), 'zones_id' => array('type' => 'INT(10)', 'unsigned' => true, 'notnull' => true, 'default' => '0'), 'shipment_id' => array('type' => 'INT(10)', 'unsigned' => true, 'notnull' => true, 'default' => '0'))); } $table_name = DBPREFIX . 'module_shop_vat'; if (Cx\Lib\UpdateUtil::table_exist($table_name) && Cx\Lib\UpdateUtil::column_exist($table_name, 'class')) { Cx\Lib\UpdateUtil::table($table_name, array('id' => array('type' => 'INT(10)', 'unsigned' => true, 'notnull' => true, 'auto_increment' => true, 'primary' => true), 'class' => array('type' => 'TINYTEXT'), 'percent' => array('type' => 'DECIMAL(5,2)', 'unsigned' => true, 'notnull' => true, 'default' => '0.00'))); } $table_name = DBPREFIX . 'module_shop_zones'; if (Cx\Lib\UpdateUtil::table_exist($table_name) && Cx\Lib\UpdateUtil::column_exist($table_name, 'zones_id')) { Cx\Lib\UpdateUtil::table($table_name, array('zones_id' => array('type' => 'INT(10)', 'unsigned' => true, 'notnull' => true, 'auto_increment' => true, 'primary' => true), 'zones_name' => array('type' => 'VARCHAR(64)', 'notnull' => true, 'default' => ''), 'activation_status' => array('type' => 'TINYINT(1)', 'unsigned' => true, 'notnull' => true, 'default' => '1'))); } // Contrexx 3.0.0 updates from here. // NOTE: All of these methods return false. Attribute::errorHandler(); Coupon::errorHandler(); // Prerequisites: // ShopSettings::errorHandler(); //ShopSettings::errorHandler(); // Called by Coupon::errorHandler();Customer::errorHandler();Order::errorHandler();ShopCategory::errorHandler(); // Prerequisites: // \Cx\Core\Setting\Controller\Setting::errorHandler(); Currency::errorHandler(); // Prerequisites: // Text::errorHandler(); //Text::errorHandler(); // Called by Currency::errorHandler();Product::errorHandler();Payment::errorHandler();ShopCategory::errorHandler(); Product::errorHandler(); // Prerequisites: // Text::errorHandler(); // Discount::errorHandler(); // Called by Customer::errorHandler(); // Manufacturer::errorHandler(); // Postrequisites: // Customer::errorHandler(); //Discount::errorHandler(); // Called by Customer::errorHandler(); //Manufacturer::errorHandler(); // Called by Product::errorHandler(); // Prerequisites: // Text::errorHandler(); //Customer::errorHandler(); // Called by Product::errorHandler(); // Prerequisites: // ShopSettings::errorHandler(); // Country::errorHandler(); // Called by Order::errorHandler(); // Order::errorHandler(); // Calls required Country::errorHandler(); // Discount::errorHandler(); // Called by Product::errorHandler(); //Order::errorHandler(); // Called by Customer::errorHandler(); // Prerequisites: // ShopSettings::errorHandler(); // Country::errorHandler(); ShopMail::errorHandler(); // Prerequisites: // MailTemplate::errorHandler(); Payment::errorHandler(); // Prerequisites: // Text::errorHandler(); // Zones::errorHandler(); // Yellowpay::errorHandler(); //Zones::errorHandler(); // Called by Payment::errorHandler();Shipment::errorHandler(); // Prerequisites: // Text::errorHandler(); //Yellowpay::errorHandler(); // Called by Payment::errorHandler(); // Prerequisites: // \Cx\Core\Setting\Controller\Setting::errorHandler(); PaymentProcessing::errorHandler(); Shipment::errorHandler(); // Prerequisites: // Zones::errorHandler(); // TODO: Check for and resolve recursion! ShopCategory::errorHandler(); // Prerequisites: // Text::errorHandler(); // ShopSettings::errorHandler(); Vat::errorHandler(); // Update page templates // Remove // [[SHOP_JAVASCRIPT_CODE]] Cx\Lib\UpdateUtil::migrateContentPageUsingRegex(array('module' => 'shop'), '/{SHOP_JAVASCRIPT_CODE}[\\r\\n]*/', '', array('content'), '3.0.0'); // Replace // In <!-- BEGIN subCategoriesRow -->...<!-- END subCategoriesRow --> // [[SHOP_PRODUCT_DETAILLINK_IMAGE]] => // index.php?section=shop[[MODULE_INDEX]]&catId=[[SHOP_CATEGORY_ID]] Cx\Lib\UpdateUtil::migrateContentPageUsingRegex(array('module' => 'shop'), '/(<!-- *BEGIN *subCategoriesRow *-->.+?)' . '{SHOP_PRODUCT_DETAILLINK_IMAGE}' . '(.+?<!-- *END *subCategoriesRow *-->)/s', '$1index.php?section=shop{MODULE_INDEX}&catId={SHOP_CATEGORY_ID}$2', array('content'), '3.0.0'); // [[TXT_SEE_LARGE_PICTURE]] => [[TXT_SHOP_GO_TO_CATEGORY]] Cx\Lib\UpdateUtil::migrateContentPageUsingRegex(array('module' => 'shop'), '/(<!-- *BEGIN *subCategoriesRow *-->.+?)' . '{TXT_SEE_LARGE_PICTURE}' . '(.+?<!-- *END *subCategoriesRow *-->)/s', '$1{TXT_SHOP_GO_TO_CATEGORY}$2', array('content'), '3.0.0'); // [[SHOP_PRODUCT_...]] => [[SHOP_CATEGORY_...]] // There may be up to nine different such placeholders! $subject = NULL; Cx\Lib\UpdateUtil::migrateContentPageUsingRegexCallback(array('module' => 'shop'), '/(<!-- *BEGIN *subCategoriesRow *-->.+?)' . '{SHOP_PRODUCT_(.*?)}' . '(.+?<!-- *END *subCategoriesRow *-->)/s', function ($subject) { preg_replace('/{SHOP_PRODUCT_(.*?)}/', '{SHOP_CATEGORY_$1}', $subject); }, array('content'), '3.0.0'); // shop/account // Needs to be replaced completely Cx\Lib\UpdateUtil::migrateContentPageUsingRegex(array('module' => 'shop', 'cmd' => 'account'), '/^.+$/s', <<<EOF <div id="shop"><!-- BEGIN core_message --> <span class="{MESSAGE_CLASS}">{MESSAGE_TEXT}</span><!-- END core_message --> <div id="shop_acc_data"> <form name="account" action="{SHOP_ACCOUNT_ACTION}" method="post" onsubmit="copy_address()" onreset="return shopReset()"> <div class="customer_address"> <h2>{TXT_CUSTOMER_ADDRESS}</h2> <div class="shop_text"> <p><label>{TXT_COMPANY}</label> <input type="text" tabindex="1" name="company" value="{SHOP_ACCOUNT_COMPANY}" /> </p> <p><label>{TXT_GREETING}<font color="#ff0000"> *</font></label> <select tabindex="2" name="gender">{SHOP_ACCOUNT_PREFIX}</select> </p> <p><label>{TXT_SURNAME}<font color="#ff0000"> *</font></label> <input type="text" tabindex="3" name="lastname" value="{SHOP_ACCOUNT_LASTNAME}" /> </p> <p><label>{TXT_FIRSTNAME}<font color="#ff0000"> *</font></label> <input type="text" tabindex="4" name="firstname" value="{SHOP_ACCOUNT_FIRSTNAME}" /> </p> <p><label>{TXT_ADDRESS}<font color="#ff0000"> *</font></label> <input type="text" tabindex="5" name="address" value="{SHOP_ACCOUNT_ADDRESS}" /> </p> <p><label>{TXT_POSTALE_CODE}<font color="#ff0000"> *</font></label> <input type="text" tabindex="6" name="zip" value="{SHOP_ACCOUNT_ZIP}" /> </p> <p><label>{TXT_CITY}<font color="#ff0000"> *</font></label> <input type="text" tabindex="7" name="city" value="{SHOP_ACCOUNT_CITY}" /> </p> <p><label>{TXT_COUNTRY}</label> <select name="countryId" id="countryId" tabindex="8"> {SHOP_ACCOUNT_COUNTRY_MENUOPTIONS} </select> </p> <p><label>{TXT_PHONE_NUMBER}<font color="#ff0000"> *</font></label> <input type="text" tabindex="9" name="phone" value="{SHOP_ACCOUNT_PHONE}" /> </p> <p><label>{TXT_FAX_NUMBER}</label> <input type="text" tabindex="10" name="fax" value="{SHOP_ACCOUNT_FAX}" /> </p> </div> </div><!-- BEGIN shipping_address --> <div class="shipping_address"> <h2>{TXT_SHIPPING_ADDRESS}</h2> <p><input type="checkbox" tabindex="21" value="1" onclick="copy_address();" id="equal_address" name="equal_address" {SHOP_EQUAL_ADDRESS_CHECKED} /> <label class="description" for="equal_address">{TXT_SAME_BILLING_ADDRESS}</label> </p> </div> <div id="shipping_address" style="display: {SHOP_EQUAL_ADDRESS_DISPLAY};"> <div class="shop_text"> <p><label>{TXT_COMPANY}</label> <input type="text" tabindex="31" name="company2" value="{SHOP_ACCOUNT_COMPANY2}" /> </p> <p><label>{TXT_GREETING}<font color="#ff0000"> *</font></label> <select tabindex="32" name="gender2">{SHOP_ACCOUNT_PREFIX2}</select> </p> <p><label>{TXT_SURNAME}<font color="#ff0000"> *</font></label> <input type="text" tabindex="33" name="lastname2" value="{SHOP_ACCOUNT_LASTNAME2}" /> </p> <p><label>{TXT_FIRSTNAME}<font color="#ff0000"> *</font></label> <input type="text" tabindex="34" name="firstname2" value="{SHOP_ACCOUNT_FIRSTNAME2}" /> </p> <p><label>{TXT_ADDRESS}<font color="#ff0000"> *</font></label> <input type="text" tabindex="35" name="address2" value="{SHOP_ACCOUNT_ADDRESS2}" /> </p> <p><label>{TXT_POSTALE_CODE}<font color="#ff0000"> *</font></label> <input type="text" tabindex="36" name="zip2" value="{SHOP_ACCOUNT_ZIP2}" size="6" /> </p> <p><label>{TXT_CITY}<font color="#ff0000"> *</font></label> <input type="text" tabindex="37" name="city2" value="{SHOP_ACCOUNT_CITY2}" /> </p> <p><label>{TXT_COUNTRY}</label> <input type="hidden" name="countryId2" id="countryId2" value="{SHOP_ACCOUNT_COUNTRY2_ID}" />{SHOP_ACCOUNT_COUNTRY2} </p> <p><label>{TXT_PHONE_NUMBER}<font color="#ff0000"> *</font></label> <input type="text" tabindex="38" name="phone2" value="{SHOP_ACCOUNT_PHONE2}" /> </p> </div> </div><!-- END shipping_address --><!-- BEGIN account_details --> <div class="account_details"> <h2>{TXT_YOUR_ACCOUNT_DETAILS}</h2><!-- BEGIN dont_register --> <p> <input type="checkbox" tabindex="61" value="1" id="dont_register" name="dont_register" {SHOP_DONT_REGISTER_CHECKED} onClick="document.getElementById('account_password').style.display = (this.checked ? 'none' : 'block');" /> <label class="description" for="dont_register">{TXT_SHOP_ACCOUNT_DONT_REGISTER}</label> <br /> {TXT_SHOP_ACCOUNT_DONT_REGISTER_NOTE} </p><!-- END dont_register --> <div class="shop_text"> <p> <label>{TXT_EMAIL}<font color="#ff0000"> *</font></label> <input type="text" tabindex="51" name="email" value="{SHOP_ACCOUNT_EMAIL}" /> </p> <div id="account_password" style="{SHOP_ACCOUNT_PASSWORD_DISPLAY};"> <p> <label>{TXT_PASSWORD}<font color="#ff0000"> *</font></label> <input type="password" tabindex="52" name="password" value="" /> </p> <p>{TXT_SHOP_ACCOUNT_PASSWORD_HINT}</p> </div> </div> </div><!-- END account_details --> <p> <input type="reset" value="{TXT_RESET}" name="reset" tabindex="71" /> <input type="submit" value="{TXT_SHOP_CONTINUE_ARROW}" name="bsubmit" tabindex="72" /> </p> </form> </div> </div> <script type="text/javascript">//<![CDATA[ function copy_address() { with (document.account) { if (jQuery("#equal_address:checked").length) { gender2.value = gender.value; company2.value = company.value; lastname2.value = lastname.value; firstname2.value = firstname.value; address2.value = address.value; zip2.value = zip.value; city2.value = city.value; phone2.value = phone.value; countryId2.value = countryId.value; jQuery("#shipping_address").hide(); } else { jQuery("#shipping_address").show(); // Optionally clear the shipment address // gender2.value = ""; // company2.value = ""; // lastname2.value = ""; // firstname2.value = ""; // address2.value = ""; // zip2.value = ""; // city2.value = ""; // phone2.value = ""; } } } jQuery(function () { jQuery(".customer_address").delegate("input", "blur", function() { if (jQuery("#equal_address:checked").length) { copy_address(); } }); }); // Redisplay the shipping address after the reset button has been clicked function shopReset() { if (!confirm("{TXT_SHOP_FORM_RESET_CONFIRM}")) { return false; } jQuery("#shipping_address").show(); return true; } copy_address(); //}></script> EOF , array('content'), '3.0.0'); // shop/login // Needs to be replaced completely Cx\Lib\UpdateUtil::migrateContentPageUsingRegex(array('module' => 'shop', 'cmd' => 'login'), '/^.+$/s', <<<EOF <div id="shop"> <!-- BEGIN core_message --> <span class="{MESSAGE_CLASS}">{MESSAGE_TEXT}</span> <!-- END core_message --> <div class="customer_old"> <form name="shop_login" action="index.php?section=login" method="post"> <input name="redirect" type="hidden" value="{SHOP_LOGIN_REDIRECT}" /> <h2>{TXT_SHOP_ACCOUNT_EXISTING_CUSTOMER}</h2> <p> <label for="username">{TXT_SHOP_EMAIL_ADDRESS}</label> <input type="text" maxlength="250" value="{SHOP_LOGIN_EMAIL}" id="username" name="USERNAME" /> </p> <p> <label for="password">{TXT_SHOP_PASSWORD}</label> <input type="password" maxlength="50" id="password" name="PASSWORD" /> </p> <p> <input type="submit" value="{TXT_SHOP_ACCOUNT_LOGIN}" name="login" /> </p> <p> <a class="lostpw" href="index.php?section=login&cmd=lostpw" title="{TXT_SHOP_ACCOUNT_LOST_PASSWORD}"> {TXT_SHOP_ACCOUNT_LOST_PASSWORD} </a> </p> </form> </div> <div class="customer_new"> <form name="shop_register" action="index.php?section=shop&cmd=login" method="post"> <h2>{TXT_SHOP_ACCOUNT_NEW_CUSTOMER}</h2> {TXT_SHOP_ACCOUNT_NOTE}<br /> <br /> <!-- BEGIN register --> <input type="submit" value="{TXT_SHOP_BUTTON_REGISTRATION}" name="baccount" /> <!-- END register --> <!-- BEGIN dont_register --> <input type="submit" value="{TXT_SHOP_BUTTON_NO_REGISTRATION}" name="bnoaccount" /> <!-- END dont_register --> </form> </div> </div> EOF , array('content'), '3.0.0'); // Note: Other templates may contain new placeholders and/or blocks, // however, these need to be added manually for version 3.0.0 features // to work. } catch (Cx\Lib\UpdateException $e) { return Cx\Lib\UpdateUtil::DefaultActionHandler($e); } //update settingsDB for missing values if ($objUpdate->_isNewerVersion($_CONFIG['coreCmsVersion'], '3.0.0')) { try { \Cx\Lib\UpdateUtil::sql('INSERT IGNORE INTO `' . DBPREFIX . 'core_setting` (`section`, `name`, `group`, `type`, `value`) VALUES (\'shop\', \'orderitems_amount_min\', \'config\', \'text\', \'0\')'); } catch (\Cx\Lib\UpdateException $e) { return \Cx\Lib\UpdateUtil::DefaultActionHandler($e); } } // add access id 4 for user groups which had access to 13 or 161 if ($objUpdate->_isNewerVersion($_CONFIG['coreCmsVersion'], '3.1.0')) { try { $result = \Cx\Lib\UpdateUtil::sql("SELECT `group_id` FROM `" . DBPREFIX . "access_group_static_ids` WHERE access_id = 13 OR access_id = 161 GROUP BY `group_id`"); if ($result !== false) { while (!$result->EOF) { \Cx\Lib\UpdateUtil::sql("INSERT IGNORE INTO `" . DBPREFIX . "access_group_static_ids` (`access_id`, `group_id`)\n VALUES (4, " . intval($result->fields['group_id']) . ")"); $result->MoveNext(); } } } catch (\Cx\Lib\UpdateException $e) { return \Cx\Lib\UpdateUtil::DefaultActionHandler($e); } } try { // add some necessary buttons to the confirmation page // fix of http://bugs.contrexx.com/contrexx/ticket/2015 Cx\Lib\UpdateUtil::migrateContentPageUsingRegexCallback(array('module' => 'shop', 'cmd' => 'confirm'), '/.*/s', function ($content) { $content .= '<a href="{NODE_SHOP_ACCOUNT}">{TXT_ORDER_BACK_TO_ACCOUNT}</a><br /> <a href="{NODE_SHOP_CART}">{TXT_ORDER_BACK_TO_CART}</a>'; }, array('content'), '3.2.0'); } catch (\Cx\Lib\UpdateException $e) { return \Cx\Lib\UpdateUtil::DefaultActionHandler($e); } try { $queries = array('INSERT IGNORE INTO `' . DBPREFIX . 'core_setting` (`section`, `name`, `group`, `type`, `value`, `values`, `ord`) VALUES ("shop","payment_lsv_active","config","text","1","",18)', 'INSERT IGNORE INTO `' . DBPREFIX . 'core_setting` (`section`, `name`, `group`, `type`, `value`, `values`, `ord`) VALUES ("shop","paymill_active","config","text","1","",3)', 'INSERT IGNORE INTO `' . DBPREFIX . 'core_setting` (`section`, `name`, `group`, `type`, `value`, `values`, `ord`) VALUES ("shop","paymill_live_private_key","config","text","","",0)', 'INSERT IGNORE INTO `' . DBPREFIX . 'core_setting` (`section`, `name`, `group`, `type`, `value`, `values`, `ord`) VALUES ("shop","paymill_live_public_key","config","text","","",0)', 'INSERT IGNORE INTO `' . DBPREFIX . 'core_setting` (`section`, `name`, `group`, `type`, `value`, `values`, `ord`) VALUES ("shop","paymill_live_public_key","config","text","","",0)', 'INSERT IGNORE INTO `' . DBPREFIX . 'core_setting` (`section`, `name`, `group`, `type`, `value`, `values`, `ord`) VALUES ("shop","paymill_test_private_key","config","text","","",2)', 'INSERT IGNORE INTO `' . DBPREFIX . 'core_setting` (`section`, `name`, `group`, `type`, `value`, `values`, `ord`) VALUES ("shop","paymill_test_public_key","config","text","","",16)', 'INSERT IGNORE INTO `' . DBPREFIX . 'core_setting` (`section`, `name`, `group`, `type`, `value`, `values`, `ord`) VALUES ("shop","paymill_use_test_account","config","text","0","",15)', 'INSERT IGNORE INTO `' . DBPREFIX . 'core_setting` (`section`, `name`, `group`, `type`, `value`, `values`, `ord`) VALUES (\'shop\',\'orderitems_amount_min\',\'config\',\'text\',\'0\',\'\',0);'); foreach ($queries as $query) { \Cx\Lib\UpdateUtil::sql($query); } } catch (\Cx\Lib\UpdateException $e) { return \Cx\Lib\UpdateUtil::DefaultActionHandler($e); } return true; }
/** * Updates the status of the Order with the given ID * * If the order exists and has the pending status (status == 0), * it is updated according to the payment and distribution type. * Note that status other than pending are never changed! * If the optional argument $newOrderStatus is set and not pending, * the order status is set to that value instead. * Returns the new Order status on success. * If either the order ID is invalid, or if the update fails, returns * the Order status "pending" (zero). * @access private * @static * @param integer $order_id The ID of the current order * @param integer $newOrderStatus The optional new order status. * @param string $handler The Payment type name in use * @return integer The new order status (may be zero) * if the order status can be changed * accordingly, zero otherwise */ static function update_status($order_id, $newOrderStatus = 0, $handler = NULL) { global $objDatabase, $_ARRAYLANG; if (is_null($handler) && isset($_REQUEST['handler'])) { $handler = contrexx_input2raw($_REQUEST['handler']); } $order_id = intval($order_id); if ($order_id == 0) { return Order::STATUS_CANCELLED; } $query = "\n SELECT status, payment_id, shipment_id\n FROM " . DBPREFIX . "module_shop" . MODULE_INDEX . "_orders\n WHERE id={$order_id}"; $objResult = $objDatabase->Execute($query); if (!$objResult || $objResult->EOF) { return Order::STATUS_CANCELLED; } $status = $objResult->fields['status']; // Never change a non-pending status! // Whether a payment was successful or not, the status must be // left alone. if ($status != Order::STATUS_PENDING) { // The status of the order is not pending. // This may be due to a wrong order ID, a page reload, // or a PayPal IPN that has been received already. // No order status is changed automatically in these cases! // Leave it as it is. return $status; } // Determine and verify the payment handler $payment_id = $objResult->fields['payment_id']; //if (!$payment_id) DBG::log("update_status($order_id, $newOrderStatus): Failed to find Payment ID for Order ID $order_id"); $processor_id = Payment::getPaymentProcessorId($payment_id); //if (!$processor_id) DBG::log("update_status($order_id, $newOrderStatus): Failed to find Processor ID for Payment ID $payment_id"); $processorName = PaymentProcessing::getPaymentProcessorName($processor_id); //if (!$processorName) DBG::log("update_status($order_id, $newOrderStatus): Failed to find Processor Name for Processor ID $processor_id"); // The payment processor *MUST* match the handler returned. if (!preg_match("/^{$handler}/i", $processorName)) { //DBG::log("update_status($order_id, $newOrderStatus): Mismatching Handlers: Order $processorName, Request ".$_GET['handler']); return Order::STATUS_CANCELLED; } // Only if the optional new order status argument is zero, // determine the new status automatically. if ($newOrderStatus == Order::STATUS_PENDING) { // The new order status is determined by two properties: // - The method of payment (instant/deferred), and // - The method of delivery (if any). // If the payment takes place instantly (currently, all // external payments processors are considered to do so), // and there is no delivery needed (because it's all // downloads), the order status is switched to 'completed' // right away. // If only one of these conditions is met, the status is set to // 'paid', or 'delivered' respectively. // If neither condition is met, the status is set to 'confirmed'. $newOrderStatus = Order::STATUS_CONFIRMED; $processorType = PaymentProcessing::getCurrentPaymentProcessorType($processor_id); $shipmentId = $objResult->fields['shipment_id']; if ($processorType == 'external') { // External payment types are considered instant. // See $_SESSION['shop']['isInstantPayment']. if ($shipmentId == 0) { // instant, download -> completed $newOrderStatus = Order::STATUS_COMPLETED; } else { // There is a shipper, so this order will bedelivered. // See $_SESSION['shop']['isDelivery']. // instant, delivery -> paid $newOrderStatus = Order::STATUS_PAID; } } else { // Internal payment types are considered deferred. if ($shipmentId == 0) { // deferred, download -> shipped $newOrderStatus = Order::STATUS_SHIPPED; } //else { deferred, delivery -> confirmed } } } $query = "\n UPDATE " . DBPREFIX . "module_shop" . MODULE_INDEX . "_orders\n SET status='{$newOrderStatus}'\n WHERE id={$order_id}"; $objResult = $objDatabase->Execute($query); if (!$objResult) { // The query failed, but all the data is okay. // Don't cancel the order, leave it as it is and let the shop // manager handle this. Return pending status. return Order::STATUS_PENDING; } if ($newOrderStatus == Order::STATUS_CONFIRMED || $newOrderStatus == Order::STATUS_PAID || $newOrderStatus == Order::STATUS_SHIPPED || $newOrderStatus == Order::STATUS_COMPLETED) { if (!ShopLibrary::sendConfirmationMail($order_id)) { // Note that this message is only shown when the page is // displayed, which may be on another request! \Message::error($_ARRAYLANG['TXT_SHOP_UNABLE_TO_SEND_EMAIL']); } } // The shopping cart *MUST* be flushed right after this method // returns a true value (greater than zero). // If the new order status is zero however, the cart may // be left alone and the payment process can be tried again. return $newOrderStatus; }
/** * Set up the detail view of the selected order * @access public * @param \Cx\Core\Html\Sigma $objTemplate The Template, by reference * @param boolean $edit Edit if true, view otherwise * @global ADONewConnection $objDatabase Database connection object * @global array $_ARRAYLANG Language array * @return boolean True on success, * false otherwise * @static * @author Reto Kohli <*****@*****.**> (parts) * @version 3.1.0 */ static function view_detail(&$objTemplate = null, $edit = false) { global $objDatabase, $_ARRAYLANG, $objInit; $backend = $objInit->mode == 'backend'; if ($objTemplate->blockExists('order_list')) { $objTemplate->hideBlock('order_list'); } $have_option = false; // The order total -- in the currency chosen by the customer $order_sum = 0; // recalculated VAT total $total_vat_amount = 0; $order_id = intval($_REQUEST['order_id']); if (!$order_id) { return \Message::error($_ARRAYLANG['TXT_SHOP_ORDER_ERROR_INVALID_ORDER_ID']); } if (!$objTemplate) { $template_name = $edit ? 'module_shop_order_edit.html' : 'module_shop_order_details.html'; $objTemplate = new \Cx\Core\Html\Sigma(\Cx\Core\Core\Controller\Cx::instanciate()->getCodeBaseModulePath() . '/Shop/View/Template/Backend'); //DBG::log("Orders::view_list(): new Template: ".$objTemplate->get()); $objTemplate->loadTemplateFile($template_name); //DBG::log("Orders::view_list(): loaded Template: ".$objTemplate->get()); } $objOrder = Order::getById($order_id); if (!$objOrder) { //DBG::log("Shop::shopShowOrderdetails(): Failed to find Order ID $order_id"); return \Message::error(sprintf($_ARRAYLANG['TXT_SHOP_ORDER_NOT_FOUND'], $order_id)); } // lsv data $query = "\n SELECT `holder`, `bank`, `blz`\n FROM " . DBPREFIX . "module_shop" . MODULE_INDEX . "_lsv\n WHERE order_id={$order_id}"; $objResult = $objDatabase->Execute($query); if (!$objResult) { return self::errorHandler(); } if ($objResult->RecordCount() == 1) { $objTemplate->setVariable(array('SHOP_ACCOUNT_HOLDER' => contrexx_raw2xhtml($objResult->fields['holder']), 'SHOP_ACCOUNT_BANK' => contrexx_raw2xhtml($objResult->fields['bank']), 'SHOP_ACCOUNT_BLZ' => contrexx_raw2xhtml($objResult->fields['blz']))); } $customer_id = $objOrder->customer_id(); if (!$customer_id) { //DBG::log("Shop::shopShowOrderdetails(): Invalid Customer ID $customer_id"); \Message::error(sprintf($_ARRAYLANG['TXT_SHOP_INVALID_CUSTOMER_ID'], $customer_id)); } $objCustomer = Customer::getById($customer_id); if (!$objCustomer) { //DBG::log("Shop::shopShowOrderdetails(): Failed to find Customer ID $customer_id"); \Message::error(sprintf($_ARRAYLANG['TXT_SHOP_CUSTOMER_NOT_FOUND'], $customer_id)); $objCustomer = new Customer(); // No editing allowed! $have_option = true; } Vat::is_reseller($objCustomer->is_reseller()); Vat::is_home_country(\Cx\Core\Setting\Controller\Setting::getValue('country_id', 'Shop') == $objOrder->country_id()); $objTemplate->setGlobalVariable($_ARRAYLANG + array('SHOP_CURRENCY' => Currency::getCurrencySymbolById($objOrder->currency_id()))); //DBG::log("Order sum: ".Currency::formatPrice($objOrder->sum())); $objTemplate->setVariable(array('SHOP_CUSTOMER_ID' => $customer_id, 'SHOP_ORDERID' => $order_id, 'SHOP_DATE' => date(ASCMS_DATE_FORMAT_INTERNATIONAL_DATETIME, strtotime($objOrder->date_time())), 'SHOP_ORDER_STATUS' => $edit ? Orders::getStatusMenu($objOrder->status(), false, null, 'swapSendToStatus(this.value)') : $_ARRAYLANG['TXT_SHOP_ORDER_STATUS_' . $objOrder->status()], 'SHOP_SEND_MAIL_STYLE' => $objOrder->status() == Order::STATUS_CONFIRMED ? 'display: inline;' : 'display: none;', 'SHOP_SEND_MAIL_STATUS' => $edit ? $objOrder->status() != Order::STATUS_CONFIRMED ? \Html::ATTRIBUTE_CHECKED : '' : '', 'SHOP_ORDER_SUM' => Currency::formatPrice($objOrder->sum()), 'SHOP_DEFAULT_CURRENCY' => Currency::getDefaultCurrencySymbol(), 'SHOP_GENDER' => $edit ? Customer::getGenderMenu($objOrder->billing_gender(), 'billing_gender') : $_ARRAYLANG['TXT_SHOP_' . strtoupper($objOrder->billing_gender())], 'SHOP_COMPANY' => $objOrder->billing_company(), 'SHOP_FIRSTNAME' => $objOrder->billing_firstname(), 'SHOP_LASTNAME' => $objOrder->billing_lastname(), 'SHOP_ADDRESS' => $objOrder->billing_address(), 'SHOP_ZIP' => $objOrder->billing_zip(), 'SHOP_CITY' => $objOrder->billing_city(), 'SHOP_COUNTRY' => $edit ? \Cx\Core\Country\Controller\Country::getMenu('billing_country_id', $objOrder->billing_country_id()) : \Cx\Core\Country\Controller\Country::getNameById($objOrder->billing_country_id()), 'SHOP_PHONE' => $objOrder->billing_phone(), 'SHOP_FAX' => $objOrder->billing_fax(), 'SHOP_EMAIL' => $objOrder->billing_email(), 'SHOP_SHIP_GENDER' => $edit ? Customer::getGenderMenu($objOrder->gender(), 'shipPrefix') : $_ARRAYLANG['TXT_SHOP_' . strtoupper($objOrder->gender())], 'SHOP_SHIP_COMPANY' => $objOrder->company(), 'SHOP_SHIP_FIRSTNAME' => $objOrder->firstname(), 'SHOP_SHIP_LASTNAME' => $objOrder->lastname(), 'SHOP_SHIP_ADDRESS' => $objOrder->address(), 'SHOP_SHIP_ZIP' => $objOrder->zip(), 'SHOP_SHIP_CITY' => $objOrder->city(), 'SHOP_SHIP_COUNTRY' => $edit ? \Cx\Core\Country\Controller\Country::getMenu('shipCountry', $objOrder->country_id()) : \Cx\Core\Country\Controller\Country::getNameById($objOrder->country_id()), 'SHOP_SHIP_PHONE' => $objOrder->phone(), 'SHOP_PAYMENTTYPE' => Payment::getProperty($objOrder->payment_id(), 'name'), 'SHOP_CUSTOMER_NOTE' => $objOrder->note(), 'SHOP_COMPANY_NOTE' => $objCustomer->companynote(), 'SHOP_SHIPPING_TYPE' => $objOrder->shipment_id() ? Shipment::getShipperName($objOrder->shipment_id()) : ' ')); if ($backend) { $objTemplate->setVariable(array('SHOP_CUSTOMER_IP' => $objOrder->ip() ? '<a href="index.php?cmd=NetTools&tpl=whois&address=' . $objOrder->ip() . '" title="' . $_ARRAYLANG['TXT_SHOW_DETAILS'] . '">' . $objOrder->ip() . '</a>' : ' ', 'SHOP_CUSTOMER_HOST' => $objOrder->host() ? '<a href="index.php?cmd=NetTools&tpl=whois&address=' . $objOrder->host() . '" title="' . $_ARRAYLANG['TXT_SHOW_DETAILS'] . '">' . $objOrder->host() . '</a>' : ' ', 'SHOP_CUSTOMER_LANG' => \FWLanguage::getLanguageParameter($objOrder->lang_id(), 'name'), 'SHOP_CUSTOMER_BROWSER' => $objOrder->browser() ? $objOrder->browser() : ' ', 'SHOP_LAST_MODIFIED' => $objOrder->modified_on() && $objOrder->modified_on() != '0000-00-00 00:00:00' ? $objOrder->modified_on() . ' ' . $_ARRAYLANG['TXT_EDITED_BY'] . ' ' . $objOrder->modified_by() : $_ARRAYLANG['TXT_ORDER_WASNT_YET_EDITED'])); } else { // Frontend: Order history ONLY. Repeat the Order, go to cart $objTemplate->setVariable(array('SHOP_ACTION_URI_ENCODED' => \Cx\Core\Routing\Url::fromModuleAndCmd('Shop', 'cart'))); } $ppName = ''; $psp_id = Payment::getPaymentProcessorId($objOrder->payment_id()); if ($psp_id) { $ppName = PaymentProcessing::getPaymentProcessorName($psp_id); } $objTemplate->setVariable(array('SHOP_SHIPPING_PRICE' => $objOrder->shipment_amount(), 'SHOP_PAYMENT_PRICE' => $objOrder->payment_amount(), 'SHOP_PAYMENT_HANDLER' => $ppName, 'SHOP_LAST_MODIFIED_DATE' => $objOrder->modified_on())); if ($edit) { // edit order $strJsArrShipment = Shipment::getJSArrays(); $objTemplate->setVariable(array('SHOP_SEND_TEMPLATE_TO_CUSTOMER' => sprintf($_ARRAYLANG['TXT_SEND_TEMPLATE_TO_CUSTOMER'], $_ARRAYLANG['TXT_ORDER_COMPLETE']), 'SHOP_SHIPPING_TYP_MENU' => Shipment::getShipperMenu($objOrder->country_id(), $objOrder->shipment_id(), "calcPrice(0);"), 'SHOP_JS_ARR_SHIPMENT' => $strJsArrShipment, 'SHOP_PRODUCT_IDS_MENU_NEW' => Products::getMenuoptions(null, null, $_ARRAYLANG['TXT_SHOP_PRODUCT_MENU_FORMAT']), 'SHOP_JS_ARR_PRODUCT' => Products::getJavascriptArray($objCustomer->group_id(), $objCustomer->is_reseller()))); } $options = $objOrder->getOptionArray(); if (!empty($options[$order_id])) { $have_option = true; } // Order items $total_weight = $i = 0; $total_net_price = $objOrder->view_items($objTemplate, $edit, $total_weight, $i); // Show VAT with the individual products: // If VAT is enabled, and we're both in the same country // ($total_vat_amount has been set above if both conditions are met) // show the VAT rate. // If there is no VAT, the amount is 0 (zero). //if ($total_vat_amount) { // distinguish between included VAT, and additional VAT added to sum $tax_part_percentaged = Vat::isIncluded() ? $_ARRAYLANG['TXT_TAX_PREFIX_INCL'] : $_ARRAYLANG['TXT_TAX_PREFIX_EXCL']; $objTemplate->setVariable(array('SHOP_TAX_PRICE' => Currency::formatPrice($total_vat_amount), 'SHOP_PART_TAX_PROCENTUAL' => $tax_part_percentaged)); //} else { // No VAT otherwise // remove it from the details overview if empty //$objTemplate->hideBlock('taxprice'); //$tax_part_percentaged = $_ARRAYLANG['TXT_NO_TAX']; //} // Parse Coupon if applicable to this product // Coupon $objCoupon = Coupon::getByOrderId($order_id); if ($objCoupon) { $discount = $objCoupon->discount_amount() != 0 ? $objCoupon->discount_amount() : $total_net_price / 100 * $objCoupon->discount_rate(); $objTemplate->setVariable(array('SHOP_COUPON_NAME' => $_ARRAYLANG['TXT_SHOP_DISCOUNT_COUPON_CODE'], 'SHOP_COUPON_CODE' => $objCoupon->code(), 'SHOP_COUPON_AMOUNT' => Currency::formatPrice(-$discount))); $total_net_price -= $discount; //DBG::log("Order::view_detail(): Coupon: ".var_export($objCoupon, true)); } $objTemplate->setVariable(array('SHOP_ROWCLASS_NEW' => 'row' . (++$i % 2 + 1), 'SHOP_TOTAL_WEIGHT' => Weight::getWeightString($total_weight), 'SHOP_NET_PRICE' => Currency::formatPrice($total_net_price))); $objTemplate->setVariable(array('TXT_PRODUCT_ID' => $_ARRAYLANG['TXT_ID'], 'TXT_TAX_RATE' => Vat::isIncluded() ? $_ARRAYLANG['TXT_TAX_PREFIX_INCL'] : $_ARRAYLANG['TXT_TAX_PREFIX_EXCL'], 'TXT_SHOP_ACCOUNT_VALIDITY' => $_ARRAYLANG['TXT_SHOP_VALIDITY'])); // Disable the "edit" button when there are Attributes if ($backend && !$edit) { if ($have_option) { if ($objTemplate->blockExists('order_no_edit')) { $objTemplate->touchBlock('order_no_edit'); } } else { if ($objTemplate->blockExists('order_edit')) { $objTemplate->touchBlock('order_edit'); } } } return true; }