/mnt/web601/b3/14/57451114/htdocs/httpdocs/admin/specials.php
<?php
/* --------------------------------------------------------------
specials.php 2023-07-06
Gambio GmbH
http://www.gambio.de
Copyright (c) 2023 Gambio GmbH
Released under the GNU General Public License (Version 2)
[http://www.gnu.org/licenses/gpl-2.0.html]
IMPORTANT! THIS FILE IS DEPRECATED AND WILL BE REPLACED IN THE FUTURE.
MODIFY IT ONLY FOR FIXES. DO NOT APPEND IT WITH NEW FEATURES, USE THE
NEW GX-ENGINE LIBRARIES INSTEAD.
--------------------------------------------------------------
based on:
(c) 2000-2001 The Exchange Project (earlier name of osCommerce)
(c) 2002-2003 osCommerce(specials.php,v 1.38 2002/05/16); www.oscommerce.com
(c) 2003 nextcommerce (specials.php,v 1.9 2003/08/18); www.nextcommerce.org
(c) 2003 XT-Commerce - community made shopping http://www.xt-commerce.com ($Id: specials.php 1125 2005-07-28 09:59:44Z novalis $)
Released under the GNU General Public License
--------------------------------------------------------------*/
require('includes/application_top.php');
if (!isset($jsEngineLanguage)) {
$jsEngineLanguage = array();
}
$languageTextManager = MainFactory::create_object('LanguageTextManager', array(), true);
$jsEngineLanguage['admin_specials'] = $languageTextManager->get_section_array('admin_specials');
$t_page_token = $_SESSION['coo_page_token']->generate_token();
require(DIR_FS_CATALOG . DIR_WS_CLASSES . 'xtcPrice.php');
$xtPrice = new xtcPrice(DEFAULT_CURRENCY, $_SESSION['customers_status']['customers_status_id']);
require_once(DIR_FS_INC . 'xtc_get_tax_rate.inc.php');
$db = StaticGXCoreLoader::getDatabaseQueryBuilder();
if (isset($_GET['sID'], $_GET['action']) && $_GET['action'] === 'edit') {
$productResult = $db->select('products_id')->get_where('specials', 'specials_id = ' . (int)$_GET['sID'])->row_array();
$productDescResult = $db->select('products_name')->get_where('products_description', 'products_id = ' . $productResult['products_id'] . ' AND language_id = ' . $_SESSION['languages_id'])->row_array();
$productsName = $productDescResult['products_name'];
}
if (isset($_GET['sID']) && !isset($_GET['pID'])) {
$productResult = $db->select('products_id')->get_where('specials', 'specials_id = ' . (int)$_GET['sID'])->row_array();
$_GET['pID'] = $productResult['products_id'] ?? null;
}
// Gets the product name in case the product does not have a Special yet
if (isset($_GET['action'], $_GET['pID']) && $_GET['action'] === 'new') {
$productDescResult = $db->select('products_name')
->where(['products_id' => (int)$_GET['pID']], ['language_id' => $_SESSION['languages_id']])
->get('products_description')
->row_array();
$productsName = $productDescResult['products_name'] ?? '';
}
switch ($_GET['action'] ?? null) {
case 'setflag':
xtc_set_specials_status($_GET['id'], $_GET['flag']);
// xtc_redirect(xtc_href_link(FILENAME_SPECIALS, '', 'NONSSL'));
break;
case 'insert':
if ($_SESSION['coo_page_token']->is_valid($_POST['page_token'])) {
// insert a product on special
if (substr($_POST['specials_price'], -1) == '%') {
$new_special_insert_query = xtc_db_query("select products_id,products_tax_class_id, products_price from " . TABLE_PRODUCTS . " where products_id = '" . (int)$_POST['products_id'] . "'");
$new_special_insert = xtc_db_fetch_array($new_special_insert_query);
$_POST['products_price'] = $new_special_insert['products_price'];
$_POST['specials_price'] = ($_POST['products_price'] - (($_POST['specials_price'] / 100) * $_POST['products_price']));
} // BOF GM_MOD
elseif (PRICE_IS_BRUTTO == 'true' && substr($_POST['specials_price'], -1) != '%') {
$sql = "SELECT
tr.tax_rate
FROM
" . TABLE_TAX_RATES . " tr,
" . TABLE_ZONES_TO_GEO_ZONES . " ztgz,
" . TABLE_PRODUCTS . " p
WHERE
tr.tax_class_id = p.products_tax_class_id AND
p.products_id = '" . (int)$_POST['products_id'] . "' AND
tr.tax_zone_id = ztgz.geo_zone_id AND
ztgz.zone_country_id = '" . (int)STORE_COUNTRY . "'";
// EOF GM_MOD
$tax_query = xtc_db_query($sql);
$tax = xtc_db_fetch_array($tax_query);
$_POST['specials_price'] = ($_POST['specials_price'] / ($tax['tax_rate'] + 100) * 100);
}
$begins_date = '1000-01-01';
$started = 1;
if ($_POST['begins_day'] && $_POST['begins_month'] && $_POST['begins_year']) {
$begins_date = sprintf('%04d%02d%02d', $_POST['begins_year'], $_POST['begins_month'], $_POST['begins_day']);
$started = 0;
}
$expires_date = '1000-01-01';
if ($_POST['day'] && $_POST['month'] && $_POST['year']) {
$expires_date = sprintf('%04d%02d%02d', $_POST['year'], $_POST['month'], $_POST['day']);
}
$productsSpecialPrice = $db->get_where('specials', 'products_id = ' . (int)$_POST['products_id'])->row_array();
$productHasSpecialPrice = $productsSpecialPrice !== null;
if($productHasSpecialPrice)
{
$oldBeginsDate = new DateTime($productsSpecialPrice['begins_date']);
$newBeginsDate = new DateTime($begins_date);
$started = ($oldBeginsDate != $newBeginsDate) ? '0' : $productsSpecialPrice['started'];
xtc_db_query("UPDATE `specials` SET
`products_id` = " . (int)$_POST['products_id'] . ",
`specials_quantity` = " . (double)$_POST['specials_quantity'] . ",
`specials_new_products_price` = " . (double)$_POST['specials_price'] . ",
`specials_date_added` = now(),
`begins_date` = '". $begins_date ."',
`started` = '" . $started . "',
`expires_date` = '" . $expires_date . "',
`status` = " . (isset($_POST['status']) ? '1' : '0') . " " .
"WHERE `products_id` = " . (int)$_POST['products_id']);
}else{
xtc_db_query("insert into " . TABLE_SPECIALS . " (products_id, specials_quantity, specials_new_products_price, specials_date_added, begins_date, started, expires_date, status) values ('" . (int)$_POST['products_id'] . "', '" . (double)$_POST['specials_quantity'] . "', '" . (double)$_POST['specials_price'] . "', now(), '" . $begins_date . "', '" . $started . "','" . $expires_date . "', '". (isset($_POST['status']) ? '1' : '0') ."')");
}
xtc_redirect(xtc_href_link(FILENAME_SPECIALS, 'page=' . ($_GET['page'] ?? null)));
}
break;
case 'update':
if ($_SESSION['coo_page_token']->is_valid($_POST['page_token'])) {
// update a product on special
if (PRICE_IS_BRUTTO == 'true' && substr($_POST['specials_price'], -1) != '%') {
// BOF GM_MOD:
$sql = "SELECT
tr.tax_rate
FROM
" . TABLE_TAX_RATES . " tr,
" . TABLE_ZONES_TO_GEO_ZONES . " ztgz,
" . TABLE_PRODUCTS . " p
WHERE
tr.tax_class_id = p.products_tax_class_id AND
p.products_id = '" . (int)$_POST['products_up_id'] . "' AND
tr.tax_zone_id = ztgz.geo_zone_id AND
ztgz.zone_country_id = '" . (int)STORE_COUNTRY . "'";
$tax_query = xtc_db_query($sql);
$tax = xtc_db_fetch_array($tax_query);
$_POST['specials_price'] = ($_POST['specials_price'] / ($tax['tax_rate'] + 100) * 100);
}
if (substr($_POST['specials_price'], -1) === '%') {
$specialsPrice = (float)substr($_POST['specials_price'], 0 ,-1 ) >= 100 ? 100 :$_POST['specials_price'];
$_POST['specials_price'] = ($_POST['products_price'] - (($specialsPrice / 100) * $_POST['products_price']));
} else {
if ((int)$_POST['specials_price'] < 0) {
$_POST['specials_price'] = (float)$_POST['products_price'] + (float)$_POST['specials_price'];
if ($_POST['specials_price'] < 0) {
$_POST['specials_price'] = 0;
}
}
}
$begins_date = '1000-01-01';
if ($_POST['begins_day'] && $_POST['begins_month'] && $_POST['begins_year']) {
$begins_date = sprintf('%04d%02d%02d', $_POST['begins_year'], $_POST['begins_month'], $_POST['begins_day']);
}
$expires_date = '1000-01-01';
if ($_POST['day'] && $_POST['month'] && $_POST['year']) {
$expires_date = sprintf('%04d%02d%02d', $_POST['year'], $_POST['month'], $_POST['day']);
}
$productsSpecialPrice = $db->get_where('specials', 'specials_id = ' . (int)$_POST['specials_id'])->row_array();
$oldBeginsDate = new DateTime($productsSpecialPrice['begins_date']);
$newBeginsDate = new DateTime($begins_date);
$started = ($oldBeginsDate != $newBeginsDate) ? '0' : $productsSpecialPrice['started'];
xtc_db_query("update " . TABLE_SPECIALS . " set specials_quantity = '" . (double)$_POST['specials_quantity'] . "', specials_new_products_price = '" . (double)$_POST['specials_price'] . "', specials_last_modified = now(), begins_date = '" . $begins_date . "', started = '" . $started . "', expires_date = '" . $expires_date . "', status = '". (isset($_POST['status']) ? '1' : '0') ."' where specials_id = '" . (int)$_POST['specials_id'] . "'");
xtc_redirect(xtc_href_link(FILENAME_SPECIALS, 'page=' . ($_GET['page'] ?? '') . '&sID=' . ($specials_id ?? '')));
}
break;
case 'deleteconfirm':
if ($_SESSION['coo_page_token']->is_valid($_POST['page_token'])) {
$specials_id = xtc_db_prepare_input($_GET['sID']);
xtc_db_query("delete from " . TABLE_SPECIALS . " where specials_id = '" . xtc_db_input($specials_id) . "'");
xtc_redirect(xtc_href_link(FILENAME_SPECIALS, 'page=' . ($_GET['page'] ?? null)));
}
break;
case 'bulk-delete-confirmed':
if ($_SESSION['coo_page_token']->is_valid($_POST['page_token']) && count($_POST['deleteSpecial']) > 0) {
foreach($_POST['deleteSpecial'] as $specialId)
{
if((int)$specialId > 0)
{
$specials_id = xtc_db_prepare_input($specialId);
xtc_db_query("delete from " . TABLE_SPECIALS . " where specials_id = '" . xtc_db_input($specials_id) . "'");
}
}
}
xtc_redirect(xtc_href_link(FILENAME_SPECIALS, 'page=' . ($_GET['page'] ?? '')));
break;
}
?>
<!DOCTYPE HTML>
<html <?php echo HTML_PARAMS; ?>>
<head>
<meta http-equiv="x-ua-compatible" content="IE=edge">
<meta http-equiv="Content-Type" content="text/html; charset=<?php echo $_SESSION['language_charset']; ?>">
<title><?php echo TITLE; ?></title>
<link rel="stylesheet" type="text/css" href="html/assets/styles/legacy/stylesheet.css">
<script type="text/javascript" src="html/assets/javascript/legacy/gm/general.js"></script>
</head>
<body marginwidth="0" marginheight="0" topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0"
bgcolor="#FFFFFF" onload="SetFocus();"
data-gx-extension="visibility_switcher"
data-visibility_switcher-selections=".tooltip_icon, span.action-list" >
<?php
include DIR_FS_ADMIN . 'html/content/specials_delete_form.php';
include DIR_FS_ADMIN . 'html/content/specials_bulk_delete_form.php';
?>
<div id="popupcalendar" class="text"></div>
<!-- header //-->
<?php require(DIR_WS_INCLUDES . 'header.php'); ?>
<!-- header_eof //-->
<!-- body //-->
<table border="0" width="100%" cellspacing="2" cellpadding="0">
<tr>
<td class="columnLeft2" width="<?php echo BOX_WIDTH; ?>" valign="top">
<table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="1" cellpadding="0" class="columnLeft">
<!-- left_navigation //-->
<?php require(DIR_WS_INCLUDES . 'column_left.php'); ?>
<!-- left_navigation_eof //-->
</table>
</td>
<!-- body_text //-->
<td class="boxCenter" width="100%" valign="top">
<div class="pageHeading">
<?php if(isset($productsName)) { ?>
<div class="page-nav-title"><?= isset($productsName) ? htmlspecialchars($productsName) : '' ?></div>
<div class="page-nav-tabs">
<div class="nav-tab">
<a href="<?php echo xtc_href_link(FILENAME_CATEGORIES, "pID={$_GET['pID']}&action=new_product"); ?>">
<?php echo $languageTextManager->get_text('TAB_GENERAL', 'admin_product_page');?>
</a>
</div>
<div class="nav-tab">
<a href="<?php echo xtc_href_link('properties_combis.php', "products_id={$_GET['pID']}&action=edit_category"); ?>">
<?php echo $languageTextManager->get_text('TAB_VARIANTS', 'admin_product_page');?>
</a>
</div>
<div class="nav-tab">
<a href="<?php echo xtc_href_link("products/{$_GET['pID']}/options"); ?>">
<?php echo $languageTextManager->get_text('TAB_OPTIONS', 'admin_product_page');?>
</a>
</div>
<div class="nav-tab">
<a href="<?php echo xtc_href_link("products/{$_GET['pID']}/downloads"); ?>">
<?php echo $languageTextManager->get_text('TAB_DOWNLOADS', 'admin_product_page');?>
</a>
</div>
<div class="nav-tab no-link">
<?php echo $languageTextManager->get_text('BUTTON_SPECIAL', 'admin_buttons');?>
</div>
<div class="nav-tab">
<a href="<?php echo xtc_href_link("categories.php",
'current_product_id=' . ($_GET['pID'] ?? '') . '&cPath='
. ($_GET['cPath'] ?? '')
. '&action=edit_crossselling'); ?>">
<?php echo $languageTextManager->get_text('TAB_CROSSSELLING',
'admin_product_page'); ?>
</a>
</div>
</div>
<style>.pageHeading > .page-nav-title { margin-top: 0 !important; }</style>
<?php } else {
echo HEADING_TITLE;
} ?>
</div>
<div class="breakpoint-large">
<?php
if (!isset($_GET['action']) || (isset($_GET['action']) && $_GET['action'] !== 'new' && $_GET['action'] !== 'edit' && $_GET['action'] !== 'delete')) {
?>
<div class="gx-container create-new-wrapper">
<div class="create-new-container pull-right">
<a href="<?php echo xtc_href_link(FILENAME_SPECIALS, 'page=' . ($_GET['page'] ?? '') . '&action=new') ?>"
class="btn btn-success"><i
class="fa fa-plus"></i> <?php echo $GLOBALS['languageTextManager']->get_text('create', 'buttons'); ?>
</a>
</div>
</div>
<?php
}
?>
<table border="0" width="100%" cellspacing="0" cellpadding="0">
<?php
if (isset($_GET['action']) && ($_GET['action'] === 'new' || $_GET['action'] === 'edit')) {
$form_action = 'insert';
if (isset($_GET['action']) && $_GET['action'] === 'edit' && !empty($_GET['sID'])) {
$form_action = 'update';
$product_query = xtc_db_query("select p.products_tax_class_id,
p.products_id,
pd.products_name,
p.products_price,
s.specials_quantity,
s.specials_new_products_price,
s.begins_date,
s.expires_date,
s.status from
" . TABLE_PRODUCTS . " p,
" . TABLE_PRODUCTS_DESCRIPTION . " pd,
" . TABLE_SPECIALS . "
s where p.products_id = pd.products_id
and pd.language_id = '" . (int)($_SESSION['languages_id'] ?? null) . "'
and p.products_id = s.products_id
and s.specials_id = '" . (int)$_GET['sID'] . "'");
$product = xtc_db_fetch_array($product_query);
$sInfo = new objectInfo($product);
} elseif (isset($_GET['action']) && $_GET['action'] === 'new' && !empty($_GET['pID'])) {
$product_query = xtc_db_query("select p.products_tax_class_id,
p.products_id,
pd.products_name,
p.products_price
from
" . TABLE_PRODUCTS . " p,
" . TABLE_PRODUCTS_DESCRIPTION . " pd
where p.products_id = pd.products_id
and pd.language_id = '" . (int)($_SESSION['languages_id'] ?? null) . "'
and p.products_id = '" . (int)$_GET['pID'] . "'");
$product = xtc_db_fetch_array($product_query);
$sInfo = new objectInfo($product);
// create an array of products on special, which will be excluded from the pull down menu of products
// (when creating a new product on special)
$specials_array = array();
// BOF GM_MOD
if (isset($_GET['pID'])) {
$specials_query = xtc_db_query("select
products_id from
" . TABLE_PRODUCTS . "
where products_id != '" . $_GET['pID'] . "'");
while ($specials = xtc_db_fetch_array($specials_query)) {
$specials_array[] = $specials['products_id'];
}
} else {
// EOF GM_MOD
$specials_query = xtc_db_query("select
p.products_id from
" . TABLE_PRODUCTS . " p,
" . TABLE_SPECIALS . " s
where s.products_id = p.products_id");
while ($specials = xtc_db_fetch_array($specials_query)) {
$specials_array[] = $specials['products_id'];
}
// BOF GM_MOD
}
// EOF GM_MOD
}
?>
<tr>
<td class="gx-container">
<form
data-gx-compatibility="specials/specials_date"
name="new_special" <?php echo 'action="' . xtc_href_link(FILENAME_SPECIALS, xtc_get_all_get_params(array('action', 'info', 'sID')) . 'action=' . $form_action, 'NONSSL') . '"'; ?>
method="post"
class="breakpoint-small"><?php if ($form_action == 'update') echo xtc_draw_hidden_field('specials_id', $_GET['sID']); ?>
<table border="0" cellspacing="0" cellpadding="0" class="gx-configuration">
<?php
// Price calculation
$price = isset($sInfo) && property_exists($sInfo, 'products_price') ? $sInfo->products_price : null;
$new_price = isset($sInfo) && property_exists($sInfo, 'specials_new_products_price') ? $sInfo->specials_new_products_price : 0;
if (PRICE_IS_BRUTTO == 'true') {
$price_netto = xtc_round($price, PRICE_PRECISION);
$new_price_netto = xtc_round($new_price, PRICE_PRECISION);
$price = ($price * (xtc_get_tax_rate(isset($sInfo) && property_exists($sInfo, 'products_tax_class_id') ? $sInfo->products_tax_class_id : null) + 100) / 100);
$new_price = ($new_price * (xtc_get_tax_rate(isset($sInfo) && property_exists($sInfo, 'products_tax_class_id') ? $sInfo->products_tax_class_id : null) + 100) / 100);
}
$price = xtc_round($price, PRICE_PRECISION);
$new_price = xtc_round($new_price, PRICE_PRECISION);
?>
<tr>
<td class="dataTableContent_gm configuration-label">
<label for="special-name"><?php echo TEXT_SPECIALS_PRODUCT; ?></label>
</td>
<td class="dataTableContent_gm">
<?php
if (isset($sInfo) && property_exists($sInfo, 'products_name') && $sInfo->products_name)
{
echo htmlspecialchars($sInfo->products_name) . ' (' . trim($xtPrice->xtcFormat($price, true)) . ')';
if ($_GET['action'] == 'new')
{
echo xtc_draw_hidden_field('products_id', $sInfo->products_id);
}
}
else
{
echo xtc_draw_products_pull_down('products_id', 'id="special-name"', $specials_array ?? null);
}
echo xtc_draw_hidden_field('products_price', isset($sInfo) && property_exists($sInfo, 'products_price') ? $sInfo->products_price : '');
?>
</td>
</tr>
<tr class="visibility_switcher">
<td class="dataTableContent_gm configuration-label"><label
for="special-price"><?php echo TEXT_SPECIALS_SPECIAL_PRICE; ?></label>
</td>
<td class="dataTableContent_gm">
<?php echo xtc_draw_input_field('specials_price', $new_price, 'id="special-price" pattern="^[\d]+[\.,]?[\d]*[%]?$" onblur="this.value=this.value.replace(\',\', \'.\')"') ?>
<span data-gx-widget="tooltip_icon"
data-tooltip_icon-type="info"><?php echo TEXT_SPECIALS_PRICE_TIP; ?></span>
</td>
</tr>
<tr>
<td class="dataTableContent_gm configuration-label"><label
for="special-qty"><?php echo TEXT_SPECIALS_SPECIAL_QUANTITY; ?></label>
</td>
<td class="dataTableContent_gm"><?php echo xtc_draw_input_field('specials_quantity', isset($sInfo->specials_quantity) ? (double)$sInfo->specials_quantity : 0, 'id="special-qty"'); ?> </td>
</tr>
<tr class="visibility_switcher">
<td class="dataTableContent_gm configuration-label"><label
for="special-date"><?php echo TEXT_SPECIALS_BEGINS_DATE; ?></label>
</td>
<td class="dataTableContent_gm">
<input type="text"
class="cursor-pointer"
id="special-begins-date"
name="begins_date"
data-jse-widget="datepicker"
data-datepicker-gx-container
value="<?php if(isset($sInfo->begins_date)
&& $sInfo->begins_date !== '1000-01-01 00:00:00'
&& $sInfo->begins_date !== '0000-00-00 00:00:00'
)
echo substr($sInfo->begins_date ?? '', 8, 2) . '.'
. substr($sInfo->begins_date ?? '', 5, 2) . '.'
. substr($sInfo->begins_date ?? '', 0, 4) ?>" />
<?php echo xtc_draw_hidden_field('begins_day', substr($sInfo->begins_date ?? '', 8, 2))
. xtc_draw_hidden_field('begins_month', substr($sInfo->begins_date ?? '', 5, 2))
. xtc_draw_hidden_field('begins_year', substr($sInfo->begins_date ?? '', 0, 4)); ?>
<span data-gx-widget="tooltip_icon"
data-tooltip_icon-type="info"><?php echo TEXT_SPECIALS_BEGINS_DATE_TIP; ?></span>
</td>
</tr>
<tr class="visibility_switcher">
<td class="dataTableContent_gm configuration-label"><label
for="special-date"><?php echo TEXT_SPECIALS_EXPIRES_DATE; ?></label>
</td>
<td class="dataTableContent_gm">
<input type="text"
class="cursor-pointer"
id="special-date"
name="date"
data-jse-widget="datepicker"
data-datepicker-gx-container
value="<?php if(isset($sInfo->expires_date)
&& $sInfo->expires_date !== '1000-01-01 00:00:00'
&& $sInfo->expires_date !== '0000-00-00 00:00:00'
)
echo substr($sInfo->expires_date ?? '', 8, 2) . '.'
. substr($sInfo->expires_date ?? '', 5, 2) . '.'
. substr($sInfo->expires_date ?? '', 0, 4) ?>" />
<?php echo xtc_draw_hidden_field('day', substr($sInfo->expires_date ?? '', 8, 2))
. xtc_draw_hidden_field('month', substr($sInfo->expires_date ?? '', 5, 2))
. xtc_draw_hidden_field('year', substr($sInfo->expires_date ?? '', 0, 4)); ?>
<span data-gx-widget="tooltip_icon"
data-tooltip_icon-type="info"><?php echo TEXT_SPECIALS_DATE_TIP; ?></span>
</td>
</tr>
<tr class="">
<td class="dataTableContent_gm configuration-label"><label for="special-status"><?= TEXT_SPECIALS_STATUS ?></label></td>
<td>
<span data-gx-widget="tooltip_icon"
data-tooltip_icon-type="info"><?php echo TEXT_SPECIALS_STATUS_TIP; ?></span>
<div class="wrapper" data-gx-widget="switcher"><input type="checkbox" name="status" <?= isset($sInfo->status) && $sInfo->status === '1' ? 'checked' : '' ?>></div>
</td>
</tr>
</table>
<br /> <br />
<div class="bottom-save-bar-content">
<?php
echo '<input type="hidden" name="products_up_id" value="' . (isset($sInfo) && property_exists($sInfo, 'products_id') ? $sInfo->products_id : '') . '">';
echo xtc_draw_hidden_field('page_token', $t_page_token);
if ($form_action == 'insert') {
echo '<input type="submit" class="btn btn-primary pull-right" value="' . BUTTON_SAVE . '"/>';
echo '<a class="btn pull-right" href="' . xtc_href_link(FILENAME_SPECIALS, 'page=' . ($_GET['page'] ?? '') . '&sID=' . ($_GET['sID'] ?? '')) . '">' . BUTTON_CANCEL . '</a>';
} else {
echo '<input type="submit" class="btn btn-primary pull-right margin-left-" value="' . BUTTON_SAVE . '" />';
echo '<a class="btn pull-right" href="' . xtc_href_link(FILENAME_SPECIALS, 'page=' . ($_GET['page'] ?? '') . '&sID=' . ($_GET['sID'] ?? '')) . '">' . BUTTON_CANCEL . '</a>';
echo '<a class="btn pull-right" href="' . gm_xtc_href_link('product_info.php', xtc_product_link((int)$_GET['sID'])) . '" target="_blank">' . BUTTON_GO_TO_PRODUCT . '</a>';
}
?>
</div>
</form>
</td>
</tr>
<?php
} else {
?>
<tr>
<td>
<table border="0" width="100%" cellspacing="0" cellpadding="0"
data-gx-extension="toolbar_icons"
data-gx-compatibility="specials/specials_bulk_delete"
class="specials">
<tr>
<td valign="top">
<table border="0" width="100%" cellspacing="0" cellpadding="0">
<tr class="dataTableHeadingRow">
<td class="dataTableHeadingContent" style="min-width: 100px"><input type="checkbox" class="select-all-checkbox"></td>
<td class="dataTableHeadingContent" style="width: 300px"><?php echo TABLE_HEADING_PRODUCTS; ?></td>
<td class="dataTableHeadingContent" style="width: 150px"><?php echo TABLE_HEADING_PRODUCTS_MODEL; ?></td>
<td class="dataTableHeadingContent" style="width: 120px"><?php echo TABLE_HEADING_PRODUCTS_PRICE; ?></td>
<td class="dataTableHeadingContent" style="width: 40px"><?php echo TEXT_INFO_PERCENTAGE; ?></td>
<td class="dataTableHeadingContent" style="width: 62px"><?php echo ucfirst(TEXT_INFO_BEGINS_EXPIRES_DATE); ?></td>
<td class="dataTableHeadingContent" style="width: 86px"><?php echo TEXT_INFO_STATUS_CHANGE; ?></td>
<td class="dataTableHeadingContent" style="width: 86px"><?php echo ucfirst(TEXT_INFO_DATE_ADDED); ?></td>
<td class="dataTableHeadingContent" style="width: 90px"><?php echo ucfirst(TEXT_INFO_LAST_MODIFIED); ?></td>
<td class="dataTableHeadingContent" style="width: 62px"><?php echo TABLE_HEADING_STATUS; ?></td>
<td class="dataTableHeadingContent" style="min-width: 100px"> </td>
</tr>
<?php
$specials_query_raw = "select p.products_id, pd.products_name,p.products_model, p.products_tax_class_id, p.products_price, s.specials_id, s.specials_new_products_price, s.specials_date_added, s.specials_last_modified, s.begins_date, s.expires_date, s.date_status_change, s.status from " . TABLE_PRODUCTS . " p, " . TABLE_SPECIALS . " s, " . TABLE_PRODUCTS_DESCRIPTION . " pd where p.products_id = pd.products_id and pd.language_id = '" . $_SESSION['languages_id'] . "' and p.products_id = s.products_id order by pd.products_name";
$pageParam = $_GET['page'] ?? null;
$specials_split = new splitPageResults($pageParam, '20', $specials_query_raw, $specials_query_numrows);
$specials_query = xtc_db_query($specials_query_raw);
if(xtc_db_num_rows($specials_query) == 0)
{
$gmLangEditTextManager = MainFactory::create('LanguageTextManager', 'gm_lang_edit', $_SESSION['languages_id']);
echo '
<tr class="gx-container no-hover">
<td colspan="10" class="text-center">' . $gmLangEditTextManager->get_text('TEXT_NO_RESULT') . '</td>
</tr>
';
}
while ($specials = xtc_db_fetch_array($specials_query)) {
$price = $specials['products_price'];
$new_price = $specials['specials_new_products_price'];
if (PRICE_IS_BRUTTO == 'true') {
$price_netto = xtc_round($price, PRICE_PRECISION);
$new_price_netto = xtc_round($new_price, PRICE_PRECISION);
$price = ($price * (xtc_get_tax_rate($specials['products_tax_class_id']) + 100) / 100);
$new_price = ($new_price * (xtc_get_tax_rate($specials['products_tax_class_id']) + 100) / 100);
}
$specials['products_price'] = xtc_round($price, PRICE_PRECISION);
$specials['specials_new_products_price'] = xtc_round($new_price, PRICE_PRECISION);
$sInfo = new objectInfo($specials);
$sInfo->specials_new_products_price = $specials['specials_new_products_price'];
$sInfo->products_price = $specials['products_price'];
?>
<tr class="visibility_switcher dataTableRow">
<td class="dataTableContent" data-gx-widget="checkbox"><input type="checkbox" class="delete-special" data-special-id="<?php echo $specials['specials_id']; ?>" data-product-name="<?php echo htmlspecialchars($specials['products_name']); ?>" data-single_checkbox></td>
<td class="dataTableContent"><?php echo htmlspecialchars($specials['products_name']); ?></td>
<td class="dataTableContent"><?php echo htmlspecialchars($specials['products_model']); ?></td>
<td class="dataTableContent numeric_cell">
<span class="oldPrice">
<?php
echo $xtPrice->xtcFormat($specials['products_price'], true);
?>
</span>
<span class="specialPrice">
<?php echo $xtPrice->xtcFormat($specials['specials_new_products_price'], true); ?>
</span>
</td>
<td class="dataTableContent numeric_cell"><?php if ($sInfo->products_price > 0) echo number_format((double)100 - (($sInfo->specials_new_products_price / $sInfo->products_price) * 100)) . '%' ?></td>
<td class="dataTableContent"><?php echo xtc_date_short($sInfo->begins_date) ?: '-' ?><br><?php echo xtc_date_short($sInfo->expires_date) ?: '-' ?></td>
<td class="dataTableContent"><?php echo xtc_date_short($sInfo->date_status_change) ?></td>
<td class="dataTableContent"><?php echo xtc_date_short($sInfo->specials_date_added) ?></td>
<td class="dataTableContent"><?php echo xtc_date_short($sInfo->specials_last_modified) ?></td>
<td class="dataTableContent">
<?php
echo '<div data-gx-widget="checkbox"
data-checkbox-checked="' . (($specials['status'] == '1') ? 'true' : 'false') . '"
data-checkbox-on_url="' . xtc_href_link(FILENAME_SPECIALS,
'action=setflag&flag=1&id=' . $specials['specials_id'] . "&page=" . ($_GET['page'] ?? ''), 'NONSSL') . '"
data-checkbox-off_url="' . xtc_href_link(FILENAME_SPECIALS,
'action=setflag&flag=0&id=' . $specials['specials_id'] . "&page=" . ($_GET['page'] ?? ''), 'NONSSL') . '"></div>';
?>
</td>
<td class="dataTableContent">
<span class="action-list">
<a class="action-icon btn-edit"
href="<?php echo xtc_href_link(FILENAME_SPECIALS, 'page=' . ($_GET['page'] ?? '') . '&sID=' . $sInfo->specials_id . '&action=edit'); ?>">
</a>
<a class="action-icon btn-delete"
data-gx-compatibility="specials/specials_modal_layer"
data-specials_modal_layer-special_id="<?php echo $sInfo->specials_id ?>"
data-specials_modal_layer-name="<?php echo htmlspecialchars_wrapper($specials['products_name']) ?>"
href="#"></a>
</span>
</td>
</tr>
<?php
}
?>
</table>
<table border="0" cellspacing="3" cellpadding="0"
class="gx-container paginator">
<tr>
<td class="pull-left">
<button class="btn btn-default bulk-delete" disabled="true"><i class="fa fa-check-square-o fa-fw btn-icon"></i> <?php echo BUTTON_DELETE; ?></button>
</td>
<td class="pagination-control">
<?php echo $specials_split->display_count($specials_query_numrows, '20', $_GET['page'] ?? null, TEXT_DISPLAY_NUMBER_OF_SPECIALS); ?>
<span class="page-number-information"><?php echo $specials_split->display_links($specials_query_numrows, '20', MAX_DISPLAY_PAGE_LINKS, $_GET['page'] ?? null); ?></span>
</td>
<!--<td align="right">--><?php //echo $specials_split->display_links($specials_query_numrows, '20', MAX_DISPLAY_PAGE_LINKS, $_GET['page'] ?? null); ?><!--</td>-->
</tr>
</table>
</td>
</tr>
</table>
</td>
<?php
}
?>
</tr>
</table>
</div>
</td>
<!-- body_text_eof //-->
</tr>
</table>
<br/>
<!-- body_eof //-->
<!-- footer //-->
<?php require(DIR_WS_INCLUDES . 'footer.php'); ?>
<!-- footer_eof //-->
</body>
</html>
<?php require(DIR_WS_INCLUDES . 'application_bottom.php'); ?>

Unexpected error occurred...
Class "main_ORIGIN" not found