'cliente_responsabile_id', 'ClienteFornitore' => 'cliente_fornitore_id', 'ClienteAnalisi' => 'clienteAnalisi', 'ClienteFatturazione' => 'ClienteFatturazione', 'MoltiplicatorePrezzo' => 'moltiplicatore_prezzo_id', 'AnagraficaCertestObject' => 'anagrafica_certest_object_id', 'AnagraficaCertestService' => 'anagrafica_certest_service_id', 'ConsegnaRichiesta' => 'consegna_richiesta', ]; // Fixed fields visibili, ordinati come imported.php $fixedStmt = $pdo->prepare(" SELECT id, fixed_field_key, is_manual, data_type, is_required, default_value, is_visible_import FROM template_fixed_mapping WHERE template_id = ? AND is_visible_import = 1 ORDER BY id "); $fixedStmt->execute([$templateId]); $fixedFieldsRaw = $fixedStmt->fetchAll(PDO::FETCH_ASSOC); $desiredOrder = [ 'ClienteResponsabile', 'ClienteFornitore', 'ClienteAnalisi', 'ClienteFatturazione', 'AnagraficaCertestObject', 'AnagraficaCertestService', 'MoltiplicatorePrezzo', 'ConsegnaRichiesta', ]; $excludeFromFixed = ['ClienteFornitore']; // reso come colonna a sé $fixedFields = []; $tempMap = []; foreach ($fixedFieldsRaw as $f) { if (in_array($f['fixed_field_key'], $excludeFromFixed, true)) continue; $tempMap[$f['fixed_field_key']] = $f; } foreach ($desiredOrder as $key) { if (isset($tempMap[$key])) { $fixedFields[] = $tempMap[$key]; unset($tempMap[$key]); } } foreach ($tempMap as $f) { $fixedFields[] = $f; } // Main field mappings (max 2), come imported.php $mapStmt = $pdo->prepare(" SELECT id, field_label, data_type, is_required, field_id, field_order, main_field, is_visible_import, manual_default FROM template_mapping WHERE template_id = ? ORDER BY field_order ASC, id ASC "); $mapStmt->execute([$templateId]); $allMappings = $mapStmt->fetchAll(PDO::FETCH_ASSOC); $mainFieldMappings = []; foreach ($allMappings as $mapping) { if ((string)$mapping['main_field'] === '1' && (int)$mapping['is_visible_import'] === 1) { $mainFieldMappings[] = $mapping; } if (count($mainFieldMappings) >= 2) break; } // Default idclient dal template $tplStmt = $pdo->prepare("SELECT idclient FROM excel_templates WHERE id = ?"); $tplStmt->execute([$templateId]); $default_idclient = $tplStmt->fetchColumn(); $default_idclient = $default_idclient !== false ? $default_idclient : null; return [ 'fixedFields' => $fixedFields, 'fixedAliasMap' => $fixedAliasMap, 'mainFieldMappings' => $mainFieldMappings, 'default_idclient' => $default_idclient, ]; } } if (!function_exists('buildGridRows')) { /** * Costruisce le righe gridData per la lista di iddatadb data, nell'ordine passato. * * @param int[] $iddatadbList * @param array $config output di buildGridConfig() * @return array righe nella stessa forma di imported.php $gridDataArray */ function buildGridRows(PDO $pdo, array $iddatadbList, array $config): array { $iddatadbList = array_values(array_filter(array_map('intval', $iddatadbList), fn($v) => $v > 0)); if (empty($iddatadbList)) { return []; } $fixedFields = $config['fixedFields']; $fixedAliasMap = $config['fixedAliasMap']; $mainFieldMappings = $config['mainFieldMappings']; $default_idclient = $config['default_idclient']; $ph = implode(',', array_fill(0, count($iddatadbList), '?')); // Righe datadb + user_name $stmt = $pdo->prepare(" SELECT d.*, CONCAT(u.first_name, ' ', u.last_name) AS user_name FROM datadb d LEFT JOIN auth_users u ON d.user_id = u.id WHERE d.iddatadb IN ($ph) "); $stmt->execute($iddatadbList); $byId = []; foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $r) { $byId[(int)$r['iddatadb']] = $r; } // Dettagli (import_data_details) $detStmt = $pdo->prepare(" SELECT d.id AS datadb_id, d.mapping_id, d.field_value, m.field_id, m.field_label, m.data_type, m.is_required, m.manual_default FROM import_data_details d JOIN template_mapping m ON d.mapping_id = m.id WHERE d.id IN ($ph) "); $detStmt->execute($iddatadbList); $detailsByRow = []; foreach ($detStmt->fetchAll(PDO::FETCH_ASSOC) as $d) { $detailsByRow[(int)$d['datadb_id']][] = $d; } // Costruzione righe nell'ordine della lista passata $rows = []; foreach ($iddatadbList as $id) { $row = $byId[$id] ?? null; if ($row === null) continue; $rowObj = [ 'iddatadb' => (int)$row['iddatadb'], 'status' => $row['status'] ?? 'i', 'idclient' => $row['idclient'] ?? $default_idclient, 'cliente_fornitore_id' => $row['cliente_fornitore_id'] ?? null, 'tested_component' => $row['tested_component'] ?? '', 'commessaweb' => $row['commessaweb'] ?? null, 'user_name' => $row['user_name'] ?? '', 'importreferencecode' => $row['importreferencecode'] ?? '', 'filename_import' => $row['filename_import'] ?? '', 'importdate' => $row['importdate'] ?? '', ]; // Fixed fields $rowObj['fixedFields'] = []; foreach ($fixedFields as $f) { $key = $f['fixed_field_key']; $dbCol = $fixedAliasMap[$key] ?? $key; $val = $row[$dbCol] ?? ''; if ($val === '' || $val === null) { $val = gdbFixedDefaultValue($f); } $rowObj['fixedFields'][$key] = (string)$val; } // Details $rowObj['details'] = []; $rowDetails = $detailsByRow[$id] ?? []; foreach ($rowDetails as $d) { $rowObj['details'][(string)$d['mapping_id']] = $d['field_value'] ?? ''; } // Main field values foreach ($mainFieldMappings as $mainMapping) { $found = null; foreach ($rowDetails as $d) { if ($d['mapping_id'] == $mainMapping['id']) { $found = $d; break; } } $rowObj['details'][(string)$mainMapping['id']] = ($found['field_value'] ?? null) ?? ($mainMapping['manual_default'] ?? ''); } if (!empty($mainFieldMappings)) { $firstMain = $mainFieldMappings[0]; $rowObj['mainFieldValue'] = $rowObj['details'][(string)$firstMain['id']] ?? ''; } $rowObj['_dirty'] = false; $rows[] = $rowObj; } return $rows; } }