feat: include full product info and tech specs in excel datasheets
Some checks failed
Build & Deploy / 🔍 Prepare (push) Successful in 10s
Build & Deploy / 🧪 QA (push) Successful in 2m21s
Build & Deploy / 🏗️ Build (push) Successful in 3m43s
Build & Deploy / 🚀 Deploy (push) Successful in 32s
Build & Deploy / 🧪 Post-Deploy Verification (push) Failing after 5m19s
Build & Deploy / 🔔 Notify (push) Successful in 1s

This commit is contained in:
2026-03-10 11:36:59 +01:00
parent 53d1e62b42
commit dd27f77c71
43 changed files with 147 additions and 117 deletions

View File

@@ -104,46 +104,76 @@ function generateExcelForProduct(product: ProductData): Buffer {
const workbook = XLSX.utils.book_new(); const workbook = XLSX.utils.book_new();
const l = product.locale === 'de'; const l = product.locale === 'de';
// Single sheet: all cross-sections from all voltage tables combined const allRows: any[][] = [];
const hasMultipleVoltages = product.voltageTables.length > 1;
const allRows: string[][] = [];
// Build unified header row // --- 1. Product Meta Data ---
// Use columns from the first voltage table (they're the same across tables) allRows.push([product.title]);
const refTable = product.voltageTables[0]; const categoriesLine = product.categories.join(' • ');
if (!refTable) { if (categoriesLine) {
// No voltage tables — create a minimal info sheet allRows.push([l ? 'Kategorien:' : 'Categories:', categoriesLine]);
const ws = XLSX.utils.aoa_to_sheet([ }
[product.title], if (product.sku) {
[l ? 'Keine Querschnittsdaten verfügbar' : 'No cross-section data available'], allRows.push([l ? 'Artikelnummer:' : 'SKU:', product.sku]);
]); }
ws['!cols'] = [{ wch: 40 }]; allRows.push([]); // blank row
XLSX.utils.book_append_sheet(workbook, ws, product.title.substring(0, 31));
return Buffer.from(XLSX.write(workbook, { type: 'buffer', bookType: 'xlsx' })); // --- 2. Application / Description ---
if (product.description) {
allRows.push([l ? 'ANWENDUNG' : 'APPLICATION']);
allRows.push([product.description]);
allRows.push([]); // blank row
} }
// --- 3. Technical Specifications ---
if (product.technicalItems && product.technicalItems.length > 0) {
allRows.push([l ? 'TECHNISCHE DATEN' : 'TECHNICAL DATA']);
for (const item of product.technicalItems) {
const val = item.unit ? `${item.value} ${item.unit}` : item.value;
allRows.push([item.label, val]);
}
allRows.push([]); // blank row
}
// --- 4. Cross-section Configurations ---
const hasMultipleVoltages = product.voltageTables.length > 1;
if (product.voltageTables.length > 0) {
allRows.push([l ? 'KONFIGURATIONEN' : 'CONFIGURATIONS']);
const refTable = product.voltageTables[0];
const headers: string[] = [ const headers: string[] = [
l ? 'Querschnitt' : 'Cross-section', l ? 'Querschnitt' : 'Cross-section',
...(hasMultipleVoltages ? [l ? 'Spannung' : 'Voltage'] : []), ...(hasMultipleVoltages ? [l ? 'Spannung' : 'Voltage'] : []),
...refTable.columns.map(c => c.label), ...refTable.columns.map((c) => c.label),
]; ];
allRows.push(headers); allRows.push(headers);
// Merge rows from all voltage tables
for (const table of product.voltageTables) { for (const table of product.voltageTables) {
for (let rowIdx = 0; rowIdx < table.crossSections.length; rowIdx++) { for (let rowIdx = 0; rowIdx < table.crossSections.length; rowIdx++) {
const row: string[] = [ const row: string[] = [
table.crossSections[rowIdx], table.crossSections[rowIdx],
...(hasMultipleVoltages ? [table.voltageLabel] : []), ...(hasMultipleVoltages ? [table.voltageLabel] : []),
...table.columns.map(c => c.get(rowIdx) || '-'), ...table.columns.map((c) => c.get(rowIdx) || '-'),
]; ];
allRows.push(row); allRows.push(row);
} }
} }
} else {
allRows.push([l ? 'Keine Querschnittsdaten verfügbar' : 'No cross-section data available']);
}
const ws = XLSX.utils.aoa_to_sheet(allRows); const ws = XLSX.utils.aoa_to_sheet(allRows);
// Auto-width: first col wider for cross-section labels
ws['!cols'] = headers.map((_, i) => ({ wch: i === 0 ? 30 : 18 })); // Auto-width: Col 0 wide for description, headers.
ws['!cols'] = [
{ wch: 45 },
{ wch: 20 },
{ wch: 15 },
{ wch: 15 },
{ wch: 15 },
{ wch: 15 },
{ wch: 15 },
{ wch: 15 },
];
const sheetName = product.title.substring(0, 31); const sheetName = product.title.substring(0, 31);
XLSX.utils.book_append_sheet(workbook, ws, sheetName); XLSX.utils.book_append_sheet(workbook, ws, sheetName);