prepare('SELECT COUNT(*) FROM turnero_examen_items WHERE exam_tipo_id = ?'); $s->execute([$id]); if ($s->fetchColumn() > 0) jsonError('Hay solicitudes con este examen. Desactívelo en su lugar.'); $pdo->prepare('DELETE FROM exam_tipo_consentimientos WHERE exam_tipo_id = ?')->execute([$id]); $pdo->prepare('DELETE FROM exam_tipos WHERE id = ?')->execute([$id]); jsonOk([], 'Examen eliminado'); } $codigo = strtoupper(trim($d['codigo'] ?? '')); $nombre = trim($d['nombre'] ?? ''); $categoria = trim($d['categoria'] ?? '') ?: null; $cups = trim($d['cups'] ?? '') ?: null; $cod_prot = trim($d['cod_protocolo'] ?? '') ?: null; $tipo_m = trim($d['tipo_muestra'] ?? '') ?: null; $nivel = isset($d['nivel']) && $d['nivel'] !== '' ? (int)$d['nivel'] : null; $abrev = trim($d['abreviatura'] ?? '') ?: null; $seremite = (int)($d['seremite'] ?? 0); $serecibe = trim($d['serecibe'] ?? '') ?: null; $activo = (int)($d['activo'] ?? 1); $req_ayuno = (int)($d['requiere_ayuno'] ?? 0); $horas_ayuno = isset($d['horas_ayuno']) && $d['horas_ayuno'] !== '' ? (int)$d['horas_ayuno'] : null; $instruc = trim($d['instrucciones'] ?? '') ?: null; $formIds = array_values(array_unique(array_filter(array_map('intval', (array)($d['form_ids'] ?? []))))); if ($codigo === '') jsonError('El código es requerido'); if ($nombre === '') jsonError('El nombre es requerido'); if (strlen($codigo) > 20) jsonError('Código máximo 20 caracteres'); $pdo = db(); $pdo->beginTransaction(); try { if ($id) { $pdo->prepare( 'UPDATE exam_tipos SET codigo=?,nombre=?,categoria=?,cups=?,cod_protocolo=?,tipo_muestra=?, nivel=?,abreviatura=?,seremite=?,serecibe=?,activo=?,requiere_ayuno=?,horas_ayuno=?,instrucciones=? WHERE id=?' )->execute([$codigo,$nombre,$categoria,$cups,$cod_prot,$tipo_m, $nivel,$abrev,$seremite,$serecibe,$activo,$req_ayuno,$horas_ayuno,$instruc,$id]); $examId = $id; } else { $pdo->prepare( 'INSERT INTO exam_tipos (codigo,nombre,categoria,cups,cod_protocolo,tipo_muestra, nivel,abreviatura,seremite,serecibe,activo,codigo_legacy,requiere_ayuno,horas_ayuno,instrucciones) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)' )->execute([$codigo,$nombre,$categoria,$cups,$cod_prot,$tipo_m, $nivel,$abrev,$seremite,$serecibe,$activo,$codigo,$req_ayuno,$horas_ayuno,$instruc]); $examId = (int)$pdo->lastInsertId(); } $pdo->prepare('DELETE FROM exam_tipo_consentimientos WHERE exam_tipo_id = ?')->execute([$examId]); $ins = $pdo->prepare('INSERT INTO exam_tipo_consentimientos (exam_tipo_id, formulario_id) VALUES (?,?)'); foreach ($formIds as $fid) { $ins->execute([$examId, $fid]); } $pdo->commit(); jsonOk(['id' => $examId], $id ? 'Examen actualizado' : 'Examen creado'); } catch (\Throwable $e) { $pdo->rollBack(); if ($e->getCode() === '23000') jsonError('Ya existe un examen con ese código'); jsonError('Error: ' . $e->getMessage(), 500); }