Files
kupshop/socket/Pohoda.Products.php
2025-08-02 16:30:27 +02:00

833 lines
33 KiB
PHP

<?php
// -----------------------------------------------------------------
use KupShop\CatalogBundle\Section\SectionTree;
use KupShop\KupShopBundle\Util\Compat\ServiceContainer;
$vat = [];
$SQL = sqlQuery('SELECT id, vat
FROM '.getTableName('vats').' ');
while ($row = sqlFetchArray($SQL)) {
$GLOBALS['vat'][$row['id']] = $row['vat'];
}
unset($row);
// kontrola delky zpracovani skriptu
controlTimeLimit();
// -----------------------------------------------------------------
$producer = [];
$SQL = sqlQuery('SELECT id, name
FROM '.getTableName('producers').' ');
while ($row = sqlFetchArray($SQL)) {
$GLOBALS['producer'][$row['id']] = strtolower(trim($row['name']));
}
unset($row);
function getVatID($val)
{
global $cfg;
$key = 0;
if (($key = array_search($val, $GLOBALS['vat'])) == false) {
$SQL = sqlQuery('INSERT INTO '.getTableName('vats')." (vat,is_default) VALUES ('".$val."','N')", '@');
$key = sqlInsertId();
$GLOBALS['vat'][$key] = $val;
}
return $key;
}
function getProducer($val)
{
global $cfg;
$key = 0;
$searchVal = strtolower(trim($val));
if (($key = array_search($searchVal, $GLOBALS['producer'])) == false && $searchVal != '') {
try {
$SQL = sqlQuery('INSERT INTO '.getTableName('producers').' (name) VALUES (:val)', ['val' => $val]);
$key = sqlInsertId();
} catch (Exception $e) {
$SQL = sqlFetchAssoc(sqlQuery('SELECT p.id FROM '.getTableName('producers').' AS p WHERE (p.name) = (:val)', ['val' => $val]));
$key = $SQL['id'];
}
$GLOBALS['producer'][$key] = $searchVal;
}
return $key;
}
function updatable(&$header, $field, $create)
{
global $cfg;
if (empty($cfg['Sync']['Fields'])) {
logError(__FILE__, __LINE__, 'Nejsou nastaveny pole pro synchronizaci!');
}
if (isset($header[$field])) {
if (isset($cfg['Sync']['Fields'][$field])) {
$value = $cfg['Sync']['Fields'][$field];
return $create || (!$create && $value);
}
}
return false;
}
function POHODA_Products(&$params)
{
$request = $params['request'];
switch ($request) {
// odesilani zmen do POHODY
case 'download':
return POHODA_ProductsDownload($params);
break;
// prijimani zmen z POHODY
case 'upload':
return POHODA_ProductsUpload($params);
break;
// pokud je spatny pozadavek
default:
$response = [
'status' => 400,
'statusMessage' => getTextString('errors', 400),
'serverTimestamp' => iso8601_encode(time()),
'requestedParams' => $params,
'responseData' => [],
];
return new xmlrpcresp(php_xmlrpc_encode($response));
break;
}
}
// ----------------------------------------------------
// odesilani zmen do POHODY
function POHODA_ProductsDownload(&$params)
{
$producer = [];
$SQL = sqlQuery('SELECT id, name FROM '.getTableName('producers').' ');
while ($row = sqlFetchArray($SQL)) {
$producer[$row['id']] = $row['name'];
}
unset($row);
$params = $params['requestParams'];
// logError(__FILE__, __LINE__, print_r($params, true), true);
// pokud neni specifikovano datum od kdy hledat udaje vrati chybu
if (!isset($params['dateFrom'])) {
$response = [
'status' => 406,
'statusMessage' => getTextString('errors', 406),
'serverTimestamp' => iso8601_encode(time()),
'requestedParams' => $params,
'responseData' => [],
];
$response2 = php_xmlrpc_encode($response);
return new xmlrpcresp($response2);
}
$response = [
'status' => 200,
'statusMessage' => getTextString('errors', 200),
'serverTimestamp' => iso8601_encode(time()),
'requestedParams' => $params,
'responseData' => [],
];
$query = 'SELECT pv.id, p.title, p.code, p.price, p.vat, p.discount, p.guarantee, p.producer, p.long_descr, p.parameters, pv.in_store, p.pieces_sold
FROM '.getTableName('products').' p JOIN '.getTableName('products_variations')." pv ON p.id=pv.id_product
WHERE updated >= '".date('Y-m-d H:i:s', iso8601_decode($params['dateFrom']))."'";
$SQL = sqlQuery($query);
if (sqlNumRows($SQL) == 0) {
$response['status'] = 204;
$response['statusMessage'] = getTextString('errors', 204);
return new xmlrpcresp(php_xmlrpc_encode($response));
}
$count = 0;
while ($row = @sqlFetchAssoc($SQL)) {
$pictures = [];
$dataItem = [
'header' => [
'productId' => intval($row['id']),
'title' => cs_win2ascii($row['title']),
'code' => cs_win2ascii(POHODA_CreateVariationCode($row['code'], $row['id'])),
'price' => doubleval($row['price']),
'rateVAT' => doubleval($row['vat']),
'discount' => doubleval($row['discount']),
'guaranteeType' => 'month',
'guaranteeQuantity' => intval($row['guarantee']),
'producer' => cs_win2ascii($producer[$row['producer']]),
'description' => cs_win2ascii($row['long_descr']),
'specification' => cs_win2ascii($row['parameters']),
'stockQuantity' => intval($row['in_store']),
'piecesSold' => intval($row['pieces_sold']),
],
'pictures' => $pictures,
];
$response['responseData'][$count] = $dataItem;
// $response['responseData'][$count] = $row;
$count++;
unset($pictures);
}
return new xmlrpcresp(php_xmlrpc_encode($response));
}
// ----------------------------------------------------
// prijimani zmen z POHODY
function POHODA_ProductsUpload(&$params)
{
global $cfg;
$requestParams = &$params['requestParams'];
$params = &$params['requestData'];
// logError(__FILE__, __LINE__, print_r($params, true), true);
$response = [
'status' => 200,
'statusMessage' => getTextString('errors', 200),
'requestedParams' => $requestParams,
'responseData' => [],
];
// logError(__FILE__, __LINE__, 'Pohoda: pocet produktu: '.count($params), true);
// logError(__FILE__, __LINE__, 'Prvni synchronizovany: '.print_r(reset($params), true), true);
$updated_codes = [];
foreach ($params as $param) {
if (!empty($param['header']['type'])) {
$response['responseData'][] = call_user_func("POHODA_ProductsUpload_{$param['header']['type']}", $param);
continue;
}
// Parse product code and separate code/variants
$product = POHODA_ParseProductCode($param['header']['code'], $param['header']);
$param['header']['code'] = $product['code'];
if (!empty($product['productId'])) {
$param['header']['productId'] = $product['productId'];
}
if (!empty($product['variationId'])) {
$param['header']['variationId'] = $product['variationId'];
}
if (!isset($param['header']['productId'])) {
$param['header']['productId'] = 0;
}
// handle variant ID in product ID
if ($param['header']['productId'] < 0) {
$query = 'SELECT p.id, p.code FROM products_variations pv LEFT JOIN '.getTableName('products').' p ON pv.id_product=p.id WHERE pv.id='.(-$param['header']['productId']);
$SQL = sqlQuery($query);
if ($row = sqlFetchAssoc($SQL)) {
if ($row['code'] == $param['header']['code']) {
$param['header']['variationId'] = -$param['header']['productId'];
$param['header']['productId'] = $row['id'];
} else {
// logError(__FILE__, __LINE__, "Product code differ!: ".print_r($param, true)." != ".print_r($row, true), true);
$param['header']['productId'] = 0;
}
} else {
$param['header']['productId'] = 0;
}
}
$param['header']['productIdOld'] = $param['header']['productId'];
$structItemDetails = null;
// pokud se posle dataItemStatus deleted smaze polozku z databaze
if (isset($param['dataItemStatus']) && ($param['dataItemStatus'] == 'deleted')) {
// logError(__FILE__, __LINE__, "Delete product: ".print_r($param, true)." - ".print_r($product, true), true);
if (!empty($cfg['Sync']['DeleteProducts']) && !empty($param['header']['productId'])) {
$productObj = new Product($param['header']['productId']);
if (count($product['variants']) != 0 && !empty($param['header']['variationId'])) {
// Delete variant
// logError(__FILE__, __LINE__, "Deleting product: {$param['header']['productId']} variation: {$param['header']['variationId']}");
$productObj->deleteVariation($param['header']['variationId']);
$structItemDetails = POHODA_getDataItemDetails($param['header']['productId'], 'ok', 200, '');
$response['responseData'][] = $structItemDetails;
continue;
} elseif (count($product['variants']) == 0) {
// Delete product without variants
// logError(__FILE__, __LINE__, "Deleting product: {$param['header']['productId']}");
$rows = $productObj->deleteVariation();
if ($rows != 0) {
$structItemDetails = POHODA_getDataItemDetails($param['header']['productId'], 'ok', 200, '');
$response['responseData'][] = $structItemDetails;
} else {
$structItemDetails = POHODA_getDataItemDetails($param['header']['productId'], 'warning', 404, '');
$response['responseData'][] = $structItemDetails;
}
continue;
}
}
// logError(__FILE__, __LINE__, "Not handled delete: ".print_r($params[$i], true)." - ".print_r($product, true));
$structItemDetails = POHODA_getDataItemDetails($param['header']['productId'], 'ok', 200, '');
$structItemDetails['dataItemId'] = $param['header']['id'];
// $structItemDetails = POHODA_getDataItemDetails(0, 'error', 400, '');
$response['responseData'][] = $structItemDetails;
continue;
}
if (empty($param['header']['code'])) {
if (!isset($cfg['Sync']['skipErrors'])) {
logError(__FILE__, __LINE__, 'Empty code: '.$param['header']['code'], true);
}
$structItemDetails = POHODA_getDataItemDetails(0, 'error', 400, '');
$response['responseData'][] = $structItemDetails;
continue;
}
if ($param['header']['productId'] == 0) {
$query = 'SELECT id FROM '.getTableName('products')." WHERE code='".$param['header']['code']."'";
$SQL = sqlQuery($query);
if ($row = sqlFetchAssoc($SQL)) {
$param['header']['productId'] = $row['id'];
/*if(!isset($updated_codes[$param['header']['code']])){
//logError(__FILE__, __LINE__, "Deleting previous variations: ".$param['header']['productId'].", code: '".$param['header']['code']."'", true);
sqlQuery("DELETE FROM ".getTableName("products_variations_choices_categorization")." WHERE id_product=".$param['header']['productId']);
sqlQuery("DELETE FROM pv USING ".getTableName("products_variations")." pv LEFT JOIN ".getTableName("products_variations_combination")." pvc ON pv.id=pvc.id_variation WHERE pvc.id_variation IS NULL");
}*/
} else {
if (empty($cfg['Sync']['CreateProducts'])) {
// logError(__FILE__, __LINE__, "Unknown product: ".$param['header']['code'], true);
$values = POHODA_setDataItemValues('productId', 0, 'id', 0);
$structItemDetails = POHODA_getDataItemDetails(0, 'error', 400, $values);
$response['responseData'][] = $structItemDetails;
continue;
}
}
}
if (!isset($updated_codes[$param['header']['code']])) {
// pokud se preda productId nebo neni nulove provede se update polozky, jinak se vlozi nova
// queryHead je nutna pro pripad ze productId predane v params neexistuje v databazi a nedojde k updatu ale provede se dodatecne nove vlozeni
if (isset($param['header']['productId']) && (!empty($param['header']['productId']) || $param['header']['productId'] != 0)) {
$update = true;
$queryHead = 'UPDATE '.getTableName('products').' SET ';
} else {
$update = false;
$queryHead = 'REPLACE INTO '.getTableName('products').' SET ';
}
$query = POHODA_ProductsUpload_getQuery($param, $update);
if ($update) {
$queryEnd = 'WHERE id='.intval($param['header']['productId']);
} else {
$queryEnd = '';
}
// logError(__FILE__, __LINE__, $queryHead.$query.$queryEnd);
$SQL = sqlQuery($queryHead.$query.$queryEnd);
// pokud byl vlozen nebo upraven radek vrati type "ok" a status 200 nebo "warning" a jiny status
// pokud nedoslo k upraveni radky ani k vlozeni noveho vrati "error"
if (sqlAffectedRows($SQL) != 0) {
if ($update) {
if (!empty($cfg['Sync']['LogUpdateProduct'])) {
static $logger = null;
$logger = $logger ?? ServiceContainer::getService('logger');
$logger->error('PohodaSync', ['query' => $queryHead.$query.$queryEnd, 'params' => $param]);
}
// logError(__FILE__, __LINE__, "Update", true);
$values = POHODA_setDataItemValues('productId', $param['header']['productId'], 'id', $param['header']['productId']);
$structItemDetails = POHODA_getDataItemDetails($param['header']['productId'], 'ok', 200, $values);
} else {
// logError(__FILE__, __LINE__, "New one id:".sqlInsertId(), true);
$values = POHODA_setDataItemValues('productId', $param['header']['productId'], 'id', sqlInsertId());
$structItemDetails = POHODA_getDataItemDetails(sqlInsertId(), 'ok', 200, $values);
$param['header']['productId'] = sqlInsertId();
}
} elseif ($update) {
// byla pozadovana uprava polozky ale productId predane v params neexistuje v databazi
// vlozi se jako nova polozka a vrati se id nove polozky
if (!empty($cfg['Sync']['CreateProducts'])) {
$queryHead = 'INSERT INTO '.getTableName('products').' SET ';
$query = POHODA_ProductsUpload_getQuery($param, false);
logError(__FILE__, __LINE__, 'spatne id pokus o vlozeni nove polozky: '.$param['header']['productId'].' inserting: '.$queryHead.$query.print_r($param, true), true);
$SQL = sqlQuery($queryHead.$query);
if (sqlAffectedRows($SQL) != 0) {
/*$values = POHODA_setDataItemValues("productId", $param['header']['productId'], "id", sqlInsertId());
$structItemDetails = POHODA_getDataItemDetails(sqlInsertId(), 'warning', 800, $values);*/
$param['header']['productId'] = sqlInsertId();
} else {
$values = POHODA_setDataItemValues('productId', $param['header']['productId'], 'id', 0);
$structItemDetails = POHODA_getDataItemDetails($param['header']['productId'], 'error', 404, $values);
}
} else {
$structItemDetails = POHODA_getDataItemDetails(0, 'error', 500, '');
}
} else {
$structItemDetails = POHODA_getDataItemDetails(0, 'error', 500, '');
}
$updated_codes[$param['header']['code']] = $param['header']['productId'];
}
// Make sure variant exists and update variant stock
if (!empty($product['variants'])) {
if (!empty($param['header']['variationId'])) {
$variation_id = $param['header']['variationId'];
} else {
$variation_id = Variations::createProductVariation($param['header']['productId'], $product['variants']);
}
$param['header']['variationId'] = $variation_id;
// Finally update stock value
$values = POHODA_ProductsUpload_getQuery($param, false, true);
$query = 'UPDATE '.getTableName('products_variations').' SET '.$values.' WHERE id='.$variation_id;
$SQL = sqlQuery($query);
}
/*else
logError(__FILE__, __LINE__, "Nejsou varianty: ".$param['header']['productId'], true);*/
if (!isDevelopment() && !empty($cfg['Sync']['Photos']['url']) && !empty($param['header']['photos'])) {
$photos = explode(';', rtrim($param['header']['photos'], ';'));
$downloader = new Downloader();
$downloader->setMethod('curl');
$photosIds = [];
foreach ($photos as $photo) {
$photosIds[] = $downloader->importProductImage($cfg['Sync']['Photos']['url'].$photo, true);
}
$first = true;
sqlStartTransaction();
sqlQuery('DELETE FROM photos_products_relation WHERE id_product=:id_product', ['id_product' => $param['header']['productId']]);
foreach ($photosIds as $photoId) {
sqlQuery('INSERT IGNORE INTO '.getTableName('photos-products').' (id_photo, id_product, show_in_lead, active) VALUES (:id_photo, :id_product, :show_in_lead, :active)',
[
'id_photo' => $photoId,
'id_product' => $param['header']['productId'],
'show_in_lead' => $first ? 'Y' : 'N',
'active' => 'Y',
]);
$first = false;
}
sqlFinishTransaction();
}
if (!empty($param['header']['productId'])) {
foreach ($cfg['Sync']['Languages'] ?? [] as $lang) {
if (!empty($param['header']["title_{$lang}"] ?? null)) {
$productsTranslations = ServiceContainer::getService(\KupShop\I18nBundle\Translations\ProductsTranslation::class);
$productsTranslations->saveSingleObject($lang,
$param['header']['productId'], [
'title' => $param['header']["title_{$lang}"],
]
);
}
}
if (!empty($cfg['Sync']['Parameters'])) {
global $listParameterAll;
if (empty($listParameterAll)) {
$listParameterAll = Parameter::get();
}
foreach ($cfg['Sync']['Parameters'] ?? [] as $field_name => $id) {
$existsValues = sqlFetchAll(sqlQuery('SELECT * FROM parameters_products WHERE id_product=:id_product and id_parameter=:id_parameter', ['id_product' => $param['header']['productId'], 'id_parameter' => $id]));
if ($existsValues) {
continue;
}
sqlQuery('DELETE FROM parameters_products WHERE id_product=:id_product and id_parameter=:id_parameter', ['id_product' => $param['header']['productId'], 'id_parameter' => $id]);
$parameter = $listParameterAll[$id];
$values = explode(';', rtrim($param['header'][$field_name], ';'));
foreach ($values as $value) {
if (!empty($param['header'][$field_name])) {
$val = getParamValue($parameter, $value);
$data = [
"value_{$parameter->value_type}" => $val,
'id_product' => $param['header']['productId'],
'id_parameter' => $parameter->id,
'value' => $val,
'unit' => getVal(0, $parameter->unit),
];
$parameter->setValue($data);
}
}
}
}
if (updatable($param['header'], 'section_ids', !$update)) {
$section_ids = array_filter(explode(';', rtrim($param['header']['section_ids'], ';')));
if (count($section_ids) > 0) {
POHODA_ProductsUpdateSections($section_ids, $param['header']['productId']);
}
}
if (!empty($cfg['Sync']['ProductsOfSuppliers']) && !empty($param['header']['supplier'])) {
$search_fields = [
'id_supplier' => intval($param['header']['supplier']),
'id_product' => $param['header']['productId'],
];
$update_fields = [
'in_store' => intval($param['header']['stockQuantity']),
'code' => $param['header']['code'],
];
$id = sqlQueryBuilder()
->select('id')
->from('products_of_suppliers')
->where(\Query\Operator::equals($search_fields))
->execute()->fetchColumn();
if ($id) {
sqlQueryBuilder()
->update('products_of_suppliers')
->directValues($update_fields)
->set('last_sync', 'NOW()')
->where(\Query\Operator::equals(['id' => $id]))
->execute();
} else {
sqlQueryBuilder()
->insert('products_of_suppliers')
->directValues(array_merge($search_fields, $update_fields))
->set('last_sync', 'NOW()')
->execute();
}
}
if (!empty($cfg['Sync']['SubstractNewOrdersFromStore'])) {
if (empty($param['header']['variationId'])) {
sqlQuery('UPDATE products p
JOIN (
SELECT oi.id_product, SUM(pieces) pieces
FROM order_items oi
JOIN orders o ON o.id = oi.id_order
WHERE o.status = 0 AND oi.id_product=:id_product AND oi.id_variation IS NULL
GROUP BY oi.id_product
) q ON q.id_product = p.id
SET p.in_store = p.in_store - q.pieces', ['id_product' => $param['header']['productId']]);
} else {
sqlQuery('UPDATE products_variations pv
JOIN (
SELECT oi.id_variation, SUM(pieces) pieces
FROM order_items oi
JOIN orders o ON o.id = oi.id_order
WHERE o.status = 0 AND oi.id_product=:id_product AND oi.id_variation=:id_variation
GROUP BY oi.id_variation
) q ON q.id_variation=pv.id
SET pv.in_store = pv.in_store - q.pieces', [
'id_product' => $param['header']['productId'],
'id_variation' => $param['header']['variationId'],
]);
}
}
if (!empty($cfg['Sync']['Stores'])) {
foreach ($cfg['Sync']['Stores'] as $store) {
if (isset($param['header']["store{$store}"])) {
$storesService = ServiceContainer::getService(\KupShop\StoresBundle\Utils\StoresInStore::class);
$storesService->updateStoreItem([
'quantity' => $param['header']["store{$store}"],
'id_store' => $store,
'id_product' => $param['header']['productId'],
'id_variation' => $param['header']['variationId'] ?? null,
], false);
}
}
}
}
if ($structItemDetails == null) {
// logError(__FILE__, __LINE__, "Last empty: ".$param['header']['productId']."-".$param['header']['productIdOld'] . ", code: '".$param['header']['code']."'", true);
$values = '';
if ($param['header']['productIdOld'] != $param['header']['productId']) {
$values = POHODA_setDataItemValues('productId', $param['header']['productIdOld'], 'id', $param['header']['productId']);
}
$structItemDetails = POHODA_getDataItemDetails($param['header']['productId'], 'ok', 200, $values);
}
if (!empty($product['variants'])) {
$structItemDetails['dataItemId'] = -$variation_id;
}
$response['responseData'][] = $structItemDetails;
}
POHODA_UpdateProductsSupplier();
// Set product price from variations
if (!empty($cfg['Sync']['SetProductPrice'])) {
sqlQuery('UPDATE products p
SET p.price=(
SELECT COALESCE(MIN(pv.price), p.price)
FROM products_variations pv
WHERE pv.id_product=p.id AND pv.in_store > 0
)');
}
// Set product price from variations
if (!empty($cfg['Sync']['Collections'])) {
POHODA_SyncCollections();
}
return new xmlrpcresp(php_xmlrpc_encode($response));
}
function POHODA_ProductsUpload_section($item)
{
$cfg = \KupShop\KupShopBundle\Config::get();
$data = $item['header'];
$id = $data['code'];
if (empty($cfg['Sync']['Sections'])) {
return POHODA_getDataItemDetails($id, 'ok', 200, '');
}
if ($param['dataItemStatus'] ?? null == 'deleted') {
sqlQuery('UPDATE sections SET figure=\'N\' WHERE id=:code', $data);
return POHODA_getDataItemDetails($id, 'ok', 200, '');
}
$exists = sqlQuery('SELECT * FROM sections WHERE id=:code', $data)->fetch();
$qb = sqlQueryBuilder()
->{$exists ? 'update' : 'insert'}('sections')
->andWhere(\Query\Operator::equals(['id' => $id]));
$values = [];
if (isset($id)) {
$values['id'] = $id;
}
if (isset($data['title'])) {
$values['name'] = $data['title'];
}
if (isset($data['visible'])) {
$values['figure'] = $data['visible'] == 'true' ? 'Y' : 'N';
}
$qb->directValues($values)
->execute();
if (!isDevelopment() && !empty($data['photo'])) {
$downloader = new Downloader();
$downloader->setMethod('curl');
$picture = $downloader->downloadImage($cfg['Sync']['Photos']['url'].trim($data['photo']));
if ($picture) {
$img = new Photos('section', $cfg['Path']['admin_to_root']);
$img->newImage($id);
$img->uploadImage($picture, false);
if ($img->checkFileType()) {
$img->insertImageIntoDB();
}
}
}
if (!empty($data['id_parent'])) {
sqlQuery('DELETE FROM sections_relation WHERE id_section = :code', $data);
sqlQueryBuilder()->insert('sections_relation')
->directValues(['id_section' => $id, 'id_topsection' => $data['id_parent'], 'position' => $data['position']])
->execute();
}
MenuSectionTree::invalidateCache();
return POHODA_getDataItemDetails($id, 'ok', 200, '');
}
function POHODA_ProductsUpdateSections($section_ids, $product_id)
{
sqlStartTransaction();
sqlQuery('DELETE FROM products_in_sections WHERE id_product=:id_product', ['id_product' => $product_id]);
$sectionTree = ServiceContainer::getService(SectionTree::class);
foreach ($section_ids as $id) {
$section = $sectionTree->getSectionById($id);
if ($section && count($section->getChildren()) == 0) {
sqlQuery('INSERT INTO products_in_sections (id_product, id_section) VALUES (:id_product, :id_section)',
['id_product' => $product_id, 'id_section' => $id]);
}
}
sqlFinishTransaction();
}
/**
* @return string
*/
function POHODA_ProductsUpload_getQuery($param, $update, $variation = false)
{
global $cfg;
$query = '';
$vat_id = getVatID($param['header']['rateVAT']);
$producer_id = getProducer($param['header']['producer']);
if (updatable($param['header'], 'EAN', !$update)) {
$query .= 'ean='.intval($param['header']['EAN']).', ';
}
if (updatable($param['header'], 'price', !$update)) {
$query .= "price='".doubleval($param['header']['price'])."', ";
}
if (updatable($param['header'], 'stockQuantity', !$update)) {
$query .= 'in_store='.intval($param['header']['stockQuantity']).', ';
}
if (!$variation) {
if (updatable($param['header'], 'code', !$update)) {
$query .= "code='".sqlFormatInput($param['header']['code'])."', ";
}
if (updatable($param['header'], 'title', !$update)) {
$query .= "title='".sqlFormatInput($param['header']['title'])."', ";
}
if (updatable($param['header'], 'rateVAT', !$update)) {
$query .= 'vat='.intval($vat_id).', ';
}
if (updatable($param['header'], 'discount', !$update)) {
$query .= 'discount='.doubleval($param['header']['discount']).', ';
}
if (updatable($param['header'], 'guaranteeQuantity', !$update)) {
$query .= 'guarantee='.intval($param['header']['guaranteeQuantity']).', ';
}
if (updatable($param['header'], 'piecesSold', !$update)) {
$query .= 'pieces_sold='.intval($param['header']['piecesSold']).', ';
}
if (updatable($param['header'], 'description', !$update)) {
$query .= "long_descr='".sqlFormatInput($param['header']['description'])."', ";
}
if (updatable($param['header'], 'specification', !$update)) {
$query .= "parameters='".sqlFormatInput($param['header']['specification'])."', ";
}
if (updatable($param['header'], 'producer', !$update) && $param['header']['producer'] != '') {
$query .= 'producer='.intval($producer_id).', ';
}
if (updatable($param['header'], 'flags', !$update)) {
$flags = trim($param['header']['flags'], ',');
$sync_flags = $cfg['Sync']['FlagsToSync'];
$query .= "campaign=ADD_TO_SET('".$flags."', ".recurseRemoveFlag($sync_flags).'), ';
}
if (!$update) {
$query .= 'date_added=NOW(), ';
}
$query .= "updated='".date('Y-m-d H:i:s')."' ";
} else {
if (updatable($param['header'], 'variation_EAN', !$update)) {
$query .= 'ean='.intval($param['header']['variation_EAN']).', ';
}
if (updatable($param['header'], 'variation_price', !$update)) {
$query .= "price='".processVat(doubleval($param['header']['variation_price']), $vat_id)."', ";
}
if (updatable($param['header'], 'variation_code', !$update)) {
$query .= "code='".sqlFormatInput($param['header']['variation_code'])."', ";
}
if (updatable($param['header'], 'weight', !$update)) {
$query .= "weight='".sqlFormatInput($param['header']['weight'])."', ";
}
}
foreach ($cfg['Sync']['PriceLists'] ?? [] as $priceListFieldName => $idPriceList) {
if (!empty($param['header']["{$priceListFieldName}Price"])) {
$priceListWorker = \KupShop\KupShopBundle\Util\Compat\ServiceContainer::getService(\KupShop\PricelistBundle\Util\PriceListWorker::class);
$priceListWorker->updatePricelists($idPriceList, [
'price' => processVat($param['header']["{$priceListFieldName}Price"], $vat_id),
'discount' => $param['header']["{$priceListFieldName}Discount"] ?? null,
'showVat' => 'N',
], $param['header']['productId'], getVat($vat_id), $param['header']['variationId'] ?? null);
}
}
return rtrim($query, ', ');
}
function processVat($price, $vat_id)
{
global $cfg;
if (!empty($cfg['Sync']['PriceWithVat'])) {
$price = calcPrice($price, -getVat($vat_id));
}
return $price;
}
function recurseRemoveFlag($flags)
{
if (empty($flags[0])) {
return 'campaign';
}
$flag = array_shift($flags);
return "REMOVE_FROM_SET('".$flag."', ".recurseRemoveFlag($flags).')';
}
function getParamValue($parameter, $value)
{
foreach ($parameter->fetchListValues() as $listValue) {
if (mb_strtolower($listValue['value'], 'utf-8') == mb_strtolower($value, 'utf-8')) {
return $listValue['id'];
}
}
sqlQuery('INSERT INTO parameters_list (id_parameter, value) VALUES (:id_parameter, :value)', ['id_parameter' => $parameter->id, 'value' => $value]);
$value = sqlInsertId();
$parameter->fetchListValues(true);
return $value;
}
/*
* SELECT p.id, p.code, p.title, pv.title as variant FROM products_variations pv left join products p on p.id=pv.id_product where sync_count<5
*/