'Unauthorized']); exit; } require_once __DIR__ . '/class/VisualLimsApiClient.class.php'; header('Content-Type: application/json'); ini_set('display_errors', '0'); error_reporting(E_ALL); $q = mb_strtolower(trim($_GET['q'] ?? '')); $limit = max(1, min(50, intval($_GET['limit'] ?? 20))); $id = isset($_GET['id']) ? intval($_GET['id']) : null; $tipo = $_GET['tipo'] ?? ''; // 'attivo' | 'inattivo' | '' (nessun filtro) function isInattivo(array $c): bool { $v = $c['Inattivo'] ?? false; return $v === true || $v === 1 || $v === '1' || $v === 'true'; } function formatClientLabel(array $client): string { $name = trim($client['Nominativo'] ?? ''); $id = trim((string)($client['IdCliente'] ?? '')); $code = trim((string)($client['CodiceCliente'] ?? '')); $parts = explode('_', $code); $suffix = trim($parts[1] ?? ''); if ($suffix === '' && $code !== '') { $suffix = substr($code, 0, 1); } if ($suffix === '') { $suffix = '--'; } return $name . ' - ' . $suffix . ' - ' . $id; } try { // Load from cache or API $cacheFile = __DIR__ . '/cache/clienti.json'; if (file_exists($cacheFile) && (time() - filemtime($cacheFile) < 3600)) { $data = json_decode(file_get_contents($cacheFile), true); } else { $api = VisualLimsApiClient::getInstance(); $params = [ '$select' => 'IdCliente,Nominativo,CodiceCliente,Inattivo', '$orderby' => 'Nominativo asc' ]; $data = $api->get("Cliente?" . http_build_query($params)); if (!is_dir(__DIR__ . '/cache')) { mkdir(__DIR__ . '/cache', 0777, true); } file_put_contents($cacheFile, json_encode($data)); } $clients = $data['value'] ?? []; // Filtro tipo, applicato SOLO alla ricerca, non al lookup per id $searchClients = $clients; if ($tipo === 'attivo') { $searchClients = array_values(array_filter($clients, fn($c) => !isInattivo($c))); } elseif ($tipo === 'inattivo') { $searchClients = array_values(array_filter($clients, fn($c) => isInattivo($c))); } // If requesting by specific ID, used for loading selected value if ($id !== null) { foreach ($clients as $c) { if ((int)$c['IdCliente'] === $id) { echo json_encode([ 'results' => [[ 'id' => $c['IdCliente'], 'text' => formatClientLabel($c), 'IdCliente' => $c['IdCliente'], 'Nominativo' => trim($c['Nominativo'] ?? ''), 'CodiceCliente' => trim($c['CodiceCliente'] ?? '') ]] ]); exit; } } echo json_encode(['results' => []]); exit; } // Search by query $results = []; foreach ($searchClients as $c) { $name = trim($c['Nominativo'] ?? ''); $code = trim($c['CodiceCliente'] ?? ''); // Cerca solo su ciò che viene visualizzato: Nome - Lettera - ID $label = formatClientLabel($c); if ( $q === '' || mb_strpos(mb_strtolower($label), $q) !== false ) { $results[] = [ 'id' => $c['IdCliente'], 'text' => $label, 'IdCliente' => $c['IdCliente'], 'Nominativo' => $name, 'CodiceCliente' => $code ]; if (count($results) >= $limit) { break; } } } echo json_encode(['results' => $results]); } catch (Exception $e) { http_response_code(500); echo json_encode(['error' => $e->getMessage()]); }