": { * valid: bool, * iddatadb: int, * errors: [ { field: "", message: "..." }, ... ] * } * } * } * * Validators are closures registered in $validators[]. * Each receives ($iddatadb, $ctx) and returns an array of errors (or empty []). * $ctx holds all prefetched data (record, parts, field values, mappings, etc.). * To add a new rule — just append another closure to $validators. */ include('include/headscript.php'); $dbHandler = DBHandlerSelect::getInstance(); $pdo = $dbHandler->getConnection(); header("Content-Type: application/json"); // ── Validators ────────────────────────────────────────────────────────────── // Each validator is a closure: fn(int $iddatadb, array $ctx): array<{field,message}> // $ctx keys: record, parts, fieldValues, requiredFixed, requiredMappings, fixedAliasMap $validators = []; // 1. Every part must have a valid Matrice // Without Matrice the LIMS API rejects the Campione creation. $validators[] = function (int $iddatadb, array $ctx): array { $parts = $ctx['parts']; if (empty($parts)) { return []; } $missing = []; foreach ($parts as $p) { $matrice = (int)($p['idmatrice'] ?? 0); if ($matrice <= 0) { $label = $p['part_number'] ?: ($p['part_description'] ?: '(senza nome)'); $missing[] = $label; } } if (!empty($missing)) { return [[ 'field' => 'parts', 'message' => 'Matrice mancante — il LIMS rifiuterà l\'esportazione. ' . 'Part senza matrice: ' . implode(', ', $missing) . '. Aprire la sezione Parts e assegnare la matrice.', ]]; } return []; }; // ── Main ──────────────────────────────────────────────────────────────────── try { $input = json_decode(file_get_contents('php://input'), true); $rows = $input['rows'] ?? []; if (empty($rows)) { echo json_encode(['success' => false, 'message' => 'No rows provided']); exit; } // ── Prefetch all data in bulk ─────────────────────────────────────────── $iddatadbList = array_column($rows, 'iddatadb'); $placeholders = implode(',', array_fill(0, count($iddatadbList), '?')); // Parts (full rows, so validators can report which parts have issues) $stmt = $pdo->prepare(" SELECT iddatadb, part_number, part_description, idmatrice FROM identification_parts WHERE iddatadb IN ($placeholders) "); $stmt->execute($iddatadbList); $partsInfo = []; foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $r) { $partsInfo[(int)$r['iddatadb']][] = $r; } // ── Run validators per row ────────────────────────────────────────────── $results = []; foreach ($rows as $rowInfo) { $iddatadb = (int)$rowInfo['iddatadb']; $index = $rowInfo['index']; // Build context for validators $ctx = [ 'parts' => $partsInfo[$iddatadb] ?? [], ]; $errors = []; foreach ($validators as $validator) { $errors = array_merge($errors, $validator($iddatadb, $ctx)); } $results[$index] = [ 'valid' => empty($errors), 'iddatadb' => $iddatadb, 'errors' => $errors, ]; } echo json_encode(['success' => true, 'results' => $results]); } catch (Exception $e) { error_log("Validation error: " . $e->getMessage()); echo json_encode(['success' => false, 'message' => $e->getMessage()]); }