feat(import-product): Enhance XML import functionality and update product prices

This commit is contained in:
2025-06-03 00:44:47 +02:00
parent 528cfaba20
commit 55ff5bf723
2 changed files with 203 additions and 40 deletions

View File

@@ -1129,10 +1129,16 @@
}, },
".htaccess": { ".htaccess": {
"type": "-", "type": "-",
"size": 3651, "size": 3670,
"lmtime": 0, "lmtime": 0,
"modified": true "modified": true
}, },
".htaccess.2025-05-22-1747946145": {
"type": "-",
"size": 3651,
"lmtime": 0,
"modified": false
},
"image_log.json": { "image_log.json": {
"type": "-", "type": "-",
"size": 128703, "size": 128703,
@@ -1626,8 +1632,8 @@
}, },
"import-product.php": { "import-product.php": {
"type": "-", "type": "-",
"size": 22539, "size": 27503,
"lmtime": 1744926713383, "lmtime": 1748716588148,
"modified": false "modified": false
}, },
"index.php": { "index.php": {

View File

@@ -3,6 +3,180 @@
include(dirname(__FILE__) . '/config/config.inc.php'); include(dirname(__FILE__) . '/config/config.inc.php');
include(dirname(__FILE__) . '/init.php'); include(dirname(__FILE__) . '/init.php');
libxml_use_internal_errors(true);
$xmlString = file_get_contents( 'https://amz.com.pl/bazy-produktow-export/produkty-amz.xml' );
if ( !$xmlString ) {
die("Error: Cannot load XML file.");
}
$xmlString = preg_replace( '/(<\/?)(\w+):([^>]*>)/', '$1$2_$3', $xmlString );
// replace '-' with '_' in XML tags
$xml = simplexml_load_string( $xmlString, 'SimpleXMLElement', LIBXML_NOCDATA );
if ( !$xml )
{
die("Error: Cannot parse XML");
}
$products_array = [];
// pętla po produktach data -> post
foreach ( $xml -> post as $productData )
{
$product_tmp = (array)$productData;
$title = $product_tmp['Nazwaproduktu'];
$title_md5 = md5( $title );
if ( strpos( $product_tmp['Dostępnerozmiaryjeślidotyczy:untitled_3'], '|' ) !== false )
{
$products_array[$title_md5]['ean'] = $product_tmp['KodEAN-13'];
$products_array[$title_md5]['title'] = $title;
$products_array[$title_md5]['price'] = floatval( str_replace( ',', '', $product_tmp['CenaBRUTTO'] ) ) / 1.23; // cena netto
}
else
{
$combination_tmp['ean'] = $product_tmp['KodEAN-13'];
$combination_tmp['price'] = floatval( str_replace( ',', '', $product_tmp['CenaBRUTTO'] ) ) / 1.23; // cena netto
if ( isset( $products_array[$title_md5] ) )
$products_array[$title_md5]['combinations'][] = $combination_tmp;
else
{
$products_array[$title_md5]['ean'] = $product_tmp['KodEAN-13'];
$products_array[$title_md5]['title'] = $title;
$products_array[$title_md5]['price'] = floatval( str_replace( ',', '', $product_tmp['CenaBRUTTO'] ) ) / 1.23; // cena netto
}
}
}
foreach ( $products_array as $product )
{
if ( !count( $product['combinations'] ) )
$price = $product['price'];
else
$price = 0; // jeśli są kombinacje, to cena jest 0
$reference = $product['ean'];
$id_tax_rules_group = 1 ; // ID grupy reguł podatkowych
$active = 1; // Ustawienie produktu jako nieaktywny
$sql = 'UPDATE `' . _DB_PREFIX_ . 'product`
SET `price` = ' . (float)$price . ',
`id_tax_rules_group` = ' . (int)$id_tax_rules_group . ',
`active` = ' . (int)$active . '
WHERE `reference` = \'' . pSQL($reference) . '\'';
$result = Db::getInstance()->execute($sql);
$result = Db::getInstance()->executeS('SELECT id_product FROM `' . _DB_PREFIX_ . 'product` WHERE `reference` = \'' . pSQL($reference) . '\'');
// $id_product może być tablicą
if ( is_array( $result ) )
{
foreach ( $result as $id )
{
// update materac_product_shop where id_product = id_product
$sql_shop = 'UPDATE `' . _DB_PREFIX_ . 'product_shop`
SET `price` = ' . (float)$price . ',
`id_tax_rules_group` = ' . (int)$id_tax_rules_group . ',
`active` = ' . (int)$active . '
WHERE `id_product` = ' . $id['id_product'];
$result_shop = Db::getInstance()->execute($sql_shop);
echo "Zaktualizowano produkt z referencją $reference, id_product: " . $id['id_product'] . ", cena: $price, id_tax_rules_group: $id_tax_rules_group, active: $active<br>";
}
}
else
{
// update materac_product_shop where id_product = id_product
$sql_shop = 'UPDATE `' . _DB_PREFIX_ . 'product_shop`
SET `price` = ' . (float)$price . ',
`id_tax_rules_group` = ' . (int)$id_tax_rules_group . ',
`active` = ' . (int)$active . '
WHERE `id_product` = ' . (int)$result;
$result_shop = Db::getInstance()->execute($sql_shop);
if ( !$result_shop )
echo "Zaktualizowano produkt z referencją $reference, id_product: $result, cena: $price, id_tax_rules_group: $id_tax_rules_group, active: $active<br>";
}
// update materac_product_attribute by reference
foreach ( $product['combinations'] as $combination )
{
$sql_combination = 'UPDATE `' . _DB_PREFIX_ . 'product_attribute`
SET `price` = ' . (float)$combination['price'] . '
WHERE `reference` = \'' . pSQL($combination['ean']) . '\'';
$result_combination = Db::getInstance()->execute($sql_combination);
// get id_product_attribute from materac_product_attribute where reference = KodEAN-13
$id_product_attribute = Db::getInstance()->getValue('SELECT id_product_attribute FROM `' . _DB_PREFIX_ . 'product_attribute` WHERE `reference` = \'' . pSQL($combination['ean']) . '\'');
if ( !$result_combination )
{
echo "Error: Cannot update product attribute with reference " . $combination['ean'] . "<br>";
continue;
}
// update materac_product_attribute_shop where id_product_attribute = id_product_attribute
$sql_combination_shop = 'UPDATE `' . _DB_PREFIX_ . 'product_attribute_shop`
SET `price` = ' . (float)$combination['price'] . '
WHERE `id_product_attribute` = ' . (int)$id_product_attribute;
$result_combination_shop = Db::getInstance()->execute($sql_combination_shop);
}
echo "Zaktualizowano kombinacje dla produktu z referencją $reference<br>";
}
exit;
// if ( strpos( $product_tmp['Dostępnerozmiaryjeślidotyczy:untitled_3'], '|' ) !== false )
// continue;
// // update price, id_tax_rules_group, active in materac_product where reference = KodEAN-13
// $reference = $product_tmp['KodEAN-13'];
// $price = floatval( str_replace( ',', '', $product_tmp['CenaBRUTTO'] ) ) / 1.23; // cena netto
// $id_tax_rules_group = 62; // ID grupy reguł podatkowych
// $active = 0; // Ustawienie produktu jako aktywnego
// $sql = 'UPDATE `' . _DB_PREFIX_ . 'product`
// SET `price` = ' . 0 . ',
// `id_tax_rules_group` = ' . (int)$id_tax_rules_group . ',
// `active` = ' . (int)$active . '
// WHERE `reference` = \'' . pSQL($reference) . '\'';
// $result = Db::getInstance()->execute($sql);
// // get id_product from materac_product where reference = KodEAN-13
// $id_product = Db::getInstance()->getValue('SELECT id_product FROM `' . _DB_PREFIX_ . 'product` WHERE `reference` = \'' . pSQL($reference) . '\'');
// if ( !$result )
// {
// echo "Error: Cannot update product with reference $reference";
// continue;
// }
// // update materac_product_shop where id_product = id_product
// $sql_shop = 'UPDATE `' . _DB_PREFIX_ . 'product_shop`
// SET `price` = ' . 0 . ',
// `id_tax_rules_group` = ' . (int)$id_tax_rules_group . ',
// `active` = ' . (int)$active . '
// WHERE `id_product` = ' . (int)$id_product;
// $result_shop = Db::getInstance()->execute($sql_shop);
// if ( !$result_shop )
// {
// echo "Error: Cannot update product shop with id_product $id_product";
// continue;
// }
// echo "Zaktualizowano produkt z referencją $reference, id_product: $id_product, cena: $price, id_tax_rules_group: $id_tax_rules_group, active: $active<br>";
// /// update materac_product_attribute by reference
// $sql_combination = 'UPDATE `' . _DB_PREFIX_ . 'product_attribute`
// SET `price` = ' . (float)$price . '
// WHERE `reference` = \'' . pSQL($reference) . '\'';
// $result_combination = Db::getInstance()->execute($sql_combination);
// if ( !$result_combination )
// {
// echo "Error: Cannot update product attribute with reference $reference";
// continue;
// }
// }
// echo '<pre>';
// print_r( $products_array );
// // exit;
// exit;
// Pobierz aktualny język kontekstu (ustaw odpowiedni ID języka, np. 1 dla polskiego) // Pobierz aktualny język kontekstu (ustaw odpowiedni ID języka, np. 1 dla polskiego)
$id_lang = Context::getContext()->language->id; $id_lang = Context::getContext()->language->id;
@@ -524,49 +698,32 @@ foreach ($productsBySymbol as $symbol => $products)
} }
else else
{ {
if ( $config['update_price'] == true and $mainProduct ->id != 35873 ) if ( $config['update_price'] == true )
{ {
// $mainProduct->price = floatval(str_replace(',','',$mainProductData->price)); $mainProduct->price = floatval(str_replace(',','',$mainProductData->price));
// $description = (string)$mainProductData->description; $description = (string)$mainProductData->description;
// $description = str_replace("\n", "<br>", $description); $description = str_replace("\n", "<br>", $description);
// $mainProduct->description = createMultiLangField($description); $mainProduct->description = createMultiLangField($description);
// $mainProduct->update(); $mainProduct->update();
// update price new price is old brutto price / 1.23
// get price brutto from db
// $oldPrice = Db::getInstance()->getValue('SELECT price FROM '._DB_PREFIX_.'product WHERE id_product = '.(int)$mainProduct->id);
// $newPrice = floatval(str_replace(',', '', $mainProductData->price)) / 1.23; // assuming old price is brutto
// // update price in product table
// Db::getInstance()->update('product', ['price' => $newPrice], 'id_product = '.(int)$mainProduct->id);
// // update price in product_shop table
// Db::getInstance()->update('product_shop', ['price' => $newPrice], 'id_product = '.(int)$mainProduct->id);
// echo "<p>Zaktualizowałem cenę produktu: " . (string)$mainProductData->title . " na " . $newPrice . "</p>";
// // do the same with combinations
// // get all combinations for the product from db
// $combinations = Db::getInstance()->executeS('SELECT id_product_attribute FROM '._DB_PREFIX_.'product_attribute WHERE id_product = '.(int)$mainProduct->id);
// foreach ($combinations as $combination) {
// // get old price from db
// $oldCombinationPrice = Db::getInstance()->getValue('SELECT price FROM '._DB_PREFIX_.'product_attribute WHERE id_product_attribute = '.(int)$combination['id_product_attribute']);
// $newCombinationPrice = floatval(str_replace(',', '', $oldCombinationPrice)) / 1.23; // assuming old price is brutto
// // update price in product_attribute table
// Db::getInstance()->update('product_attribute', ['price' => $newCombinationPrice], 'id_product_attribute = '.(int)$combination['id_product_attribute']);
// // // update price in product_attribute_shop table
// Db::getInstance()->update('product_attribute_shop', ['price' => $newCombinationPrice], 'id_product_attribute = '.(int)$combination['id_product_attribute']);
// echo "<p>Zaktualizowałem cenę kombinacji: " . (string)$mainProductData->title . " na " . $newCombinationPrice . "</p>";
// }
} }
if ( $config['update_tax_id'] == true ) if ( $config['update_tax_id'] == true )
{ {
// Update tax ID in product column id_tax_rules_group, value 62, table materac_product // check actual tax ID
Db::getInstance()->update('product', ['id_tax_rules_group' => 62], 'id_product = '.(int)$mainProduct->id ); $currentTaxId = Db::getInstance()->getValue('SELECT id_tax_rules_group FROM '._DB_PREFIX_.'product WHERE id_product = '.(int)$mainProduct->id);
// also table materac_product_shop if ($currentTaxId == 62) {
Db::getInstance()->update('product_shop', ['id_tax_rules_group' => 62], 'id_product = '.(int)$mainProduct->id ); // echo '<p>Produkt już ma ustawiony ID podatku 62: ' . (string)$mainProductData->title . '</p>';
} else {
// Update tax ID in product column id_tax_rules_group, value 62, table materac_product
Db::getInstance()->update('product', ['id_tax_rules_group' => 62], 'id_product = '.(int)$mainProduct->id);
// also table materac_product_shop
Db::getInstance()->update('product_shop', ['id_tax_rules_group' => 62], 'id_product = '.(int)$mainProduct->id . ' AND id_shop = 1');
echo '<p>Zaktualizowano ID podatku dla produktu: ' . (string)$mainProductData->title . '</p>';
// change product to active by db // change product to active by db
Db::getInstance()->update('product', ['active' => 1], 'id_product = '.(int)$mainProduct->id); Db::getInstance()->update('product', ['active' => 1], 'id_product = '.(int)$mainProduct->id);
Db::getInstance()->update('product_shop', ['active' => 1], 'id_product = '.(int)$mainProduct->id ); Db::getInstance()->update('product_shop', ['active' => 1], 'id_product = '.(int)$mainProduct->id . ' AND id_shop = 1');
}
} }
} }