$row['data'], 'excelrow' => [($row['excelrow'] ?? '')], 'style_codes' => [], 'style_descriptions' => [] ]; } else { $grouped_data[$key]['excelrow'][] = ($row['excelrow'] ?? ''); } // Split STYLE CODE + STYLE DESCRIPTION $action2_value = trim((string)($row['data'][$action2_index] ?? '')); if ($action2_value !== '') { $parts = explode(' - ', $action2_value, 2); $style_code = trim((string)($parts[0] ?? '')); $style_description = trim((string)($parts[1] ?? '')); if ($style_code !== '') { $grouped_data[$key]['style_codes'][] = $style_code; } if ($style_description !== '') { $grouped_data[$key]['style_descriptions'][] = $style_description; } } else { error_log("Valore vuoto in action2 per excelrow " . ($row['excelrow'] ?? 'N/A')); } } $new_excel_data = []; foreach ($grouped_data as $key => $group) { $row_data = $group['data']; // Update STYLE CODE and STYLE DESCRIPTION with aggregated unique values $row_data[$action3_index] = implode(' - ', array_unique($group['style_codes'])); $row_data[$action4_index] = implode(' - ', array_unique($group['style_descriptions'])); // Concatenate excelrow values with "+" $excelrow_clean = array_filter($group['excelrow'], function ($value) { return $value !== null && $value !== ''; }); $excelrow_value = count($excelrow_clean) > 1 ? implode('+', $excelrow_clean) : (reset($excelrow_clean) ?: ''); $new_excel_data[] = [ 'data' => $row_data, 'excelrow' => $excelrow_value ]; } $excelData = $new_excel_data; $part1_applied = true; error_log("Routine part 1 completata - Righe aggregate: " . count($new_excel_data)); error_log("Excelrow aggregati part 1: " . print_r(array_column($new_excel_data, 'excelrow'), true)); } /** * PART 2 * Merge package-related columns into PACKAGE * Always applied if PACKAGE exists */ foreach ($excelData as $index => $row) { if (!isset($row['data']) || !is_array($row['data'])) { error_log("Riga non valida nella part 2, manca 'data' all'indice $index"); continue; } $package_values = []; $value_package = trim((string)($row['data'][$package_index] ?? '')); $value_other_test = $other_test_index !== false ? trim((string)($row['data'][$other_test_index] ?? '')) : ''; $value_only_colorfastness = $only_colorfastness_index !== false ? trim((string)($row['data'][$only_colorfastness_index] ?? '')) : ''; $value_only_chemical = $only_chemical_index !== false ? trim((string)($row['data'][$only_chemical_index] ?? '')) : ''; if ($value_package !== '') { $package_values[] = $value_package; } if ($value_other_test !== '') { $package_values[] = $value_other_test; } if ($value_only_colorfastness !== '') { $package_values[] = $value_only_colorfastness; } if ($value_only_chemical !== '') { $package_values[] = $value_only_chemical; } $package_values = array_unique($package_values); $excelData[$index]['data'][$package_index] = implode(' - ', $package_values); } error_log("Routine part 2 completata - Merge package applicato su " . count($excelData) . " righe"); if (!$part1_applied) { error_log("Warning finale: routine part 1 non applicata, routine part 2 applicata correttamente"); } error_log("Routine Moncler completata con successo"); } catch (Exception $e) { error_log("Eccezione nella routine Moncler: " . $e->getMessage()); throw $e; } }