Files
klz-cables.com/scripts/fix-missing-attributes.js
2026-01-06 23:15:24 +01:00

353 lines
15 KiB
JavaScript
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env node
/**
* Script to fix missing attributes for high-voltage cables
* Creates a manual attribute mapping based on product specifications
*/
const fs = require('fs');
const path = require('path');
const PROCESSED_DIR = path.join(__dirname, '..', 'data', 'processed');
const BACKUP_DIR = path.join(__dirname, '..', 'data', 'backup');
// Create backup directory
if (!fs.existsSync(BACKUP_DIR)) {
fs.mkdirSync(BACKUP_DIR, { recursive: true });
}
/**
* Manual attribute mappings for high-voltage cables
* Based on typical specifications for these cable types
*/
const MANUAL_ATTRIBUTES = {
// High Voltage Cables - Aluminum conductor, XLPE insulation
'na2xsfl2y-3': { // NA2XS(FL)2Y high voltage
en: [
{ name: 'Conductor', options: ['Aluminum'] },
{ name: 'Insulation', options: ['XLPE'] },
{ name: 'Sheath', options: ['PE'] },
{ name: 'Screen', options: ['Copper wire + tape'] },
{ name: 'Water blocking', options: ['Yes'] },
{ name: 'Voltage rating', options: ['6/10 kV', '12/20 kV', '18/30 kV'] },
{ name: 'Installation', options: ['Underground', 'Cable ducts', 'Outdoor'] },
{ name: 'Standard', options: ['IEC 60840', 'DIN VDE 0276-620'] },
{ name: 'Conductor material', options: ['Aluminum'] },
{ name: 'Conductor type', options: ['Compacted stranded'] },
{ name: 'Insulation material', options: ['XLPE'] },
{ name: 'Sheath material', options: ['PE'] },
{ name: 'Armour', options: ['None'] },
{ name: 'Max operating temperature', options: ['+90 °C'] },
{ name: 'Short circuit temperature', options: ['+250 °C'] },
{ name: 'Bending radius', options: ['Min. 15x diameter'] }
],
de: [
{ name: 'Leiter', options: ['Aluminium'] },
{ name: 'Isolation', options: ['XLPE'] },
{ name: 'Mantel', options: ['PE'] },
{ name: 'Abschirmung', options: ['Kupferdraht + Band'] },
{ name: 'Wassersperre', options: ['Ja'] },
{ name: 'Spannungsbereich', options: ['6/10 kV', '12/20 kV', '18/30 kV'] },
{ name: 'Installation', options: ['Unterirdisch', 'Kabelrohre', 'Außen'] },
{ name: 'Norm', options: ['IEC 60840', 'DIN VDE 0276-620'] },
{ name: 'Leitermaterial', options: ['Aluminium'] },
{ name: 'Leitertyp', options: ['Verdrillt'] },
{ name: 'Isolationsmaterial', options: ['XLPE'] },
{ name: 'Mantelmaterial', options: ['PE'] },
{ name: 'Bewehrung', options: ['Keine'] },
{ name: 'Max. Betriebstemperatur', options: ['+90 °C'] },
{ name: 'Kurzschlusstemperatur', options: ['+250 °C'] },
{ name: 'Biegeradius', options: ['Min. 15x Durchmesser'] }
]
},
'n2xsfl2y': { // N2XS(FL)2Y high voltage
en: [
{ name: 'Conductor', options: ['Copper'] },
{ name: 'Insulation', options: ['XLPE'] },
{ name: 'Sheath', options: ['PE'] },
{ name: 'Screen', options: ['Copper wire + tape'] },
{ name: 'Water blocking', options: ['Yes'] },
{ name: 'Voltage rating', options: ['6/10 kV', '12/20 kV', '18/30 kV'] },
{ name: 'Installation', options: ['Underground', 'Cable ducts', 'Outdoor'] },
{ name: 'Standard', options: ['IEC 60840', 'DIN VDE 0276-620'] },
{ name: 'Conductor material', options: ['Copper'] },
{ name: 'Conductor type', options: ['Stranded'] },
{ name: 'Insulation material', options: ['XLPE'] },
{ name: 'Sheath material', options: ['PE'] },
{ name: 'Armour', options: ['None'] },
{ name: 'Max operating temperature', options: ['+90 °C'] },
{ name: 'Short circuit temperature', options: ['+250 °C'] },
{ name: 'Bending radius', options: ['Min. 15x diameter'] }
],
de: [
{ name: 'Leiter', options: ['Kupfer'] },
{ name: 'Isolation', options: ['XLPE'] },
{ name: 'Mantel', options: ['PE'] },
{ name: 'Abschirmung', options: ['Kupferdraht + Band'] },
{ name: 'Wassersperre', options: ['Ja'] },
{ name: 'Spannungsbereich', options: ['6/10 kV', '12/20 kV', '18/30 kV'] },
{ name: 'Installation', options: ['Unterirdisch', 'Kabelrohre', 'Außen'] },
{ name: 'Norm', options: ['IEC 60840', 'DIN VDE 0276-620'] },
{ name: 'Leitermaterial', options: ['Kupfer'] },
{ name: 'Leitertyp', options: ['Verdrillt'] },
{ name: 'Isolationsmaterial', options: ['XLPE'] },
{ name: 'Mantelmaterial', options: ['PE'] },
{ name: 'Bewehrung', options: ['Keine'] },
{ name: 'Max. Betriebstemperatur', options: ['+90 °C'] },
{ name: 'Kurzschlusstemperatur', options: ['+250 °C'] },
{ name: 'Biegeradius', options: ['Min. 15x Durchmesser'] }
]
},
'h1z2z2-k': { // H1Z2Z2-K solar cable
en: [
{ name: 'Conductor', options: ['Tinned copper'] },
{ name: 'Insulation', options: ['XLPE'] },
{ name: 'Sheath', options: ['XLPE'] },
{ name: 'Voltage rating', options: ['1.5 kV'] },
{ name: 'Temperature range', options: ['-40 °C to +120 °C'] },
{ name: 'Standard', options: ['DIN EN 50618', 'VDE 0283-618'] },
{ name: 'Flame retardant', options: ['Yes'] },
{ name: 'Halogen free', options: ['Yes'] },
{ name: 'UV resistant', options: ['Yes'] },
{ name: 'Conductor class', options: ['Class 5'] },
{ name: 'Test voltage', options: ['6.5 kV'] },
{ name: 'CPR class', options: ['Eca'] }
],
de: [
{ name: 'Leiter', options: ['Verzinntes Kupfer'] },
{ name: 'Isolation', options: ['XLPE'] },
{ name: 'Mantel', options: ['XLPE'] },
{ name: 'Spannungsbereich', options: ['1.5 kV'] },
{ name: 'Temperaturbereich', options: ['-40 °C bis +120 °C'] },
{ name: 'Norm', options: ['DIN EN 50618', 'VDE 0283-618'] },
{ name: 'Flammhemmend', options: ['Ja'] },
{ name: 'Halogenfrei', options: ['Ja'] },
{ name: 'UV-beständig', options: ['Ja'] },
{ name: 'Leiterklasse', options: ['Klasse 5'] },
{ name: 'Prüfspannung', options: ['6.5 kV'] },
{ name: 'CPR-Klasse', options: ['Eca'] }
]
},
'na2xfk2y': { // NA2X(F)K2Y high voltage
en: [
{ name: 'Conductor', options: ['Copper'] },
{ name: 'Insulation', options: ['XLPE'] },
{ name: 'Sheath', options: ['PVC'] },
{ name: 'Screen', options: ['Copper wire'] },
{ name: 'Voltage rating', options: ['64/110 kV'] },
{ name: 'Installation', options: ['Underground', 'Cable ducts'] },
{ name: 'Standard', options: ['IEC 60502-2'] },
{ name: 'Conductor material', options: ['Copper'] },
{ name: 'Insulation material', options: ['XLPE'] },
{ name: 'Sheath material', options: ['PVC'] },
{ name: 'Max operating temperature', options: ['+90 °C'] },
{ name: 'Short circuit temperature', options: ['+250 °C'] }
],
de: [
{ name: 'Leiter', options: ['Kupfer'] },
{ name: 'Isolation', options: ['XLPE'] },
{ name: 'Mantel', options: ['PVC'] },
{ name: 'Abschirmung', options: ['Kupferdraht'] },
{ name: 'Spannungsbereich', options: ['64/110 kV'] },
{ name: 'Installation', options: ['Unterirdisch', 'Kabelrohre'] },
{ name: 'Norm', options: ['IEC 60502-2'] },
{ name: 'Leitermaterial', options: ['Kupfer'] },
{ name: 'Isolationsmaterial', options: ['XLPE'] },
{ name: 'Mantelmaterial', options: ['PVC'] },
{ name: 'Max. Betriebstemperatur', options: ['+90 °C'] },
{ name: 'Kurzschlusstemperatur', options: ['+250 °C'] }
]
},
'n2xfk2y': { // N2X(F)K2Y high voltage
en: [
{ name: 'Conductor', options: ['Copper'] },
{ name: 'Insulation', options: ['XLPE'] },
{ name: 'Sheath', options: ['PVC'] },
{ name: 'Screen', options: ['Copper wire'] },
{ name: 'Voltage rating', options: ['64/110 kV'] },
{ name: 'Installation', options: ['Underground', 'Cable ducts'] },
{ name: 'Standard', options: ['IEC 60502-2'] },
{ name: 'Conductor material', options: ['Copper'] },
{ name: 'Insulation material', options: ['XLPE'] },
{ name: 'Sheath material', options: ['PVC'] },
{ name: 'Max operating temperature', options: ['+90 °C'] },
{ name: 'Short circuit temperature', options: ['+250 °C'] }
],
de: [
{ name: 'Leiter', options: ['Kupfer'] },
{ name: 'Isolation', options: ['XLPE'] },
{ name: 'Mantel', options: ['PVC'] },
{ name: 'Abschirmung', options: ['Kupferdraht'] },
{ name: 'Spannungsbereich', options: ['64/110 kV'] },
{ name: 'Installation', options: ['Unterirdisch', 'Kabelrohre'] },
{ name: 'Norm', options: ['IEC 60502-2'] },
{ name: 'Leitermaterial', options: ['Kupfer'] },
{ name: 'Isolationsmaterial', options: ['XLPE'] },
{ name: 'Mantelmaterial', options: ['PVC'] },
{ name: 'Max. Betriebstemperatur', options: ['+90 °C'] },
{ name: 'Kurzschlusstemperatur', options: ['+250 °C'] }
]
},
'na2xfkld2y': { // NA2X(F)KLD2Y high voltage
en: [
{ name: 'Conductor', options: ['Copper'] },
{ name: 'Insulation', options: ['XLPE'] },
{ name: 'Sheath', options: ['PE'] },
{ name: 'Screen', options: ['Copper wire + tape'] },
{ name: 'Voltage rating', options: ['64/110 kV'] },
{ name: 'Installation', options: ['Direct burial', 'Cable tray'] },
{ name: 'Standard', options: ['IEC 60502-2'] },
{ name: 'Conductor material', options: ['Copper'] },
{ name: 'Insulation material', options: ['XLPE'] },
{ name: 'Sheath material', options: ['PE'] },
{ name: 'Armour', options: ['Aluminum tape'] },
{ name: 'Max operating temperature', options: ['+90 °C'] },
{ name: 'Short circuit temperature', options: ['+250 °C'] }
],
de: [
{ name: 'Leiter', options: ['Kupfer'] },
{ name: 'Isolation', options: ['XLPE'] },
{ name: 'Mantel', options: ['PE'] },
{ name: 'Abschirmung', options: ['Kupferdraht + Band'] },
{ name: 'Spannungsbereich', options: ['64/110 kV'] },
{ name: 'Installation', options: ['Direktverlegung', 'Kabeltragg'] },
{ name: 'Norm', options: ['IEC 60502-2'] },
{ name: 'Leitermaterial', options: ['Kupfer'] },
{ name: 'Isolationsmaterial', options: ['XLPE'] },
{ name: 'Mantelmaterial', options: ['PE'] },
{ name: 'Bewehrung', options: ['Aluminiumband'] },
{ name: 'Max. Betriebstemperatur', options: ['+90 °C'] },
{ name: 'Kurzschlusstemperatur', options: ['+250 °C'] }
]
},
'n2xfkld2y': { // N2X(F)KLD2Y high voltage
en: [
{ name: 'Conductor', options: ['Copper'] },
{ name: 'Insulation', options: ['XLPE'] },
{ name: 'Sheath', options: ['PE'] },
{ name: 'Screen', options: ['Copper wire + tape'] },
{ name: 'Voltage rating', options: ['64/110 kV'] },
{ name: 'Installation', options: ['Direct burial', 'Cable tray'] },
{ name: 'Standard', options: ['IEC 60502-2'] },
{ name: 'Conductor material', options: ['Copper'] },
{ name: 'Insulation material', options: ['XLPE'] },
{ name: 'Sheath material', options: ['PE'] },
{ name: 'Armour', options: ['Aluminum tape'] },
{ name: 'Max operating temperature', options: ['+90 °C'] },
{ name: 'Short circuit temperature', options: ['+250 °C'] }
],
de: [
{ name: 'Leiter', options: ['Kupfer'] },
{ name: 'Isolation', options: ['XLPE'] },
{ name: 'Mantel', options: ['PE'] },
{ name: 'Abschirmung', options: ['Kupferdraht + Band'] },
{ name: 'Spannungsbereich', options: ['64/110 kV'] },
{ name: 'Installation', options: ['Direktverlegung', 'Kabeltragg'] },
{ name: 'Norm', options: ['IEC 60502-2'] },
{ name: 'Leitermaterial', options: ['Kupfer'] },
{ name: 'Isolationsmaterial', options: ['XLPE'] },
{ name: 'Mantelmaterial', options: ['PE'] },
{ name: 'Bewehrung', options: ['Aluminiumband'] },
{ name: 'Max. Betriebstemperatur', options: ['+90 °C'] },
{ name: 'Kurzschlusstemperatur', options: ['+250 °C'] }
]
}
};
function addMissingAttributes() {
console.log('🔧 Fixing missing product attributes\n');
const productsPath = path.join(PROCESSED_DIR, 'products.json');
if (!fs.existsSync(productsPath)) {
console.error('❌ products.json not found');
return;
}
// Load current products
const products = JSON.parse(fs.readFileSync(productsPath, 'utf8'));
console.log(`📊 Loaded ${products.length} products`);
// Create backup
const backupPath = path.join(BACKUP_DIR, `products-${Date.now()}.json`);
fs.writeFileSync(backupPath, JSON.stringify(products, null, 2));
console.log(`💾 Backup created: ${backupPath}`);
let fixedCount = 0;
let alreadyFixedCount = 0;
// Process each product
const updatedProducts = products.map(product => {
// Skip if already has attributes
if (product.attributes && product.attributes.length > 0) {
alreadyFixedCount++;
return product;
}
// Find matching manual attributes
const slug = product.slug;
const manualSet = MANUAL_ATTRIBUTES[slug];
if (manualSet) {
const attributes = product.locale === 'en' ? manualSet.en : manualSet.de;
console.log(`✅ Fixed: ${product.name} (${product.locale})`);
console.log(` Added ${attributes.length} attributes`);
fixedCount++;
return {
...product,
attributes: attributes.map((attr, index) => ({
id: index,
name: attr.name,
slug: attr.name.toLowerCase().replace(/\s+/g, '-'),
position: index,
visible: true,
variation: true,
options: attr.options
}))
};
}
// No manual mapping found
return product;
});
// Save updated products
fs.writeFileSync(productsPath, JSON.stringify(updatedProducts, null, 2));
// Summary
console.log('\n' + '='.repeat(60));
console.log('📊 SUMMARY');
console.log('='.repeat(60));
console.log(`Total products: ${products.length}`);
console.log(`Already had attributes: ${alreadyFixedCount}`);
console.log(`Fixed with manual mapping: ${fixedCount}`);
console.log(`Still missing: ${products.length - alreadyFixedCount - fixedCount}`);
// Show which products still need work
const stillMissing = updatedProducts.filter(p => !p.attributes || p.attributes.length === 0);
if (stillMissing.length > 0) {
console.log('\n⚠ Products still missing attributes:');
stillMissing.forEach(p => {
console.log(` - ${p.name} (${p.slug}) [ID: ${p.id}, Locale: ${p.locale}]`);
});
}
console.log(`\n✅ Attribute fix complete!`);
console.log(`💾 Updated file: ${productsPath}`);
}
// Run if called directly
if (require.main === module) {
addMissingAttributes();
}
module.exports = { addMissingAttributes, MANUAL_ATTRIBUTES };