getConnection(); $stmt = $pdo->prepare(" SELECT p.id, p.iddatadb, p.part_number, p.part_description, p.material, p.color, p.mix, p.idmatrice, p.note, p.dateexpiry, a.NomeMatriceTraduzione FROM identification_parts p LEFT JOIN auth_matrici a ON a.IdMatrice = p.idmatrice WHERE p.iddatadb = ? ORDER BY CASE WHEN p.part_number IS NULL THEN 999999 ELSE p.part_number END ASC, p.id ASC "); $stmt->execute([$iddatadb]); $parts = $stmt->fetchAll(PDO::FETCH_ASSOC); $partIds = array_column($parts, 'id'); $assignedAnalysesByPart = []; if (!empty($partIds)) { $placeholders = implode(',', array_fill(0, count($partIds), '?')); $stmtAssigned = $pdo->prepare(" SELECT ipa.id, ipa.part_id, ipa.analysis_recordkey, ipa.analysis_name, ipa.analysis_method, ipa.analysis_level, ipa.is_web_selectable, ipa.is_accredited FROM identification_parts_analyses ipa WHERE ipa.part_id IN ($placeholders) ORDER BY ipa.analysis_name ASC, ipa.id ASC "); $stmtAssigned->execute($partIds); $assignedRows = $stmtAssigned->fetchAll(PDO::FETCH_ASSOC); foreach ($assignedRows as $row) { $partId = (int)$row['part_id']; if (!isset($assignedAnalysesByPart[$partId])) { $assignedAnalysesByPart[$partId] = []; } $assignedAnalysesByPart[$partId][] = $row; } } /** * Build matrix groups from parts. * No join for now: we use idmatrice only. */ $matrixGroups = []; foreach ($parts as $part) { $matrixKey = (!empty($part['idmatrice'])) ? (string)$part['idmatrice'] : 'NO_MATRIX'; if (!isset($matrixGroups[$matrixKey])) { $matrixGroups[$matrixKey] = [ 'idmatrice' => $part['idmatrice'], 'NomeMatriceTraduzione' => $part['NomeMatriceTraduzione'] ?? '', 'parts_count' => 0, 'parts' => [], ]; } $matrixGroups[$matrixKey]['parts_count']++; $matrixGroups[$matrixKey]['parts'][] = $part['id']; } $matrixGroups = array_values($matrixGroups); ?>