119 lines
5.0 KiB
PHP
119 lines
5.0 KiB
PHP
<?php
|
|
/**
|
|
* modules/turnero/api/save_lugar.php
|
|
* GET ?id=X → devuelve datos de un lugar
|
|
* POST {nombre, descripcion, sort_order, activo} → crear
|
|
* POST {id, nombre, descripcion, sort_order, activo} → actualizar
|
|
* POST {id, _delete: true} → eliminar
|
|
*/
|
|
require_once __DIR__ . '/_helpers.php';
|
|
require_once __DIR__ . '/../../../classes/lab/ActividadAdmin.php';
|
|
|
|
requireTurnero();
|
|
|
|
// ── GET: devolver datos de un lugar ──────────────────────────
|
|
if ($_SERVER['REQUEST_METHOD'] === 'GET') {
|
|
$id = (int)($_GET['id'] ?? 0);
|
|
if (!$id) jsonError('ID requerido');
|
|
$row = db()->prepare('SELECT * FROM turnero_lugares WHERE id = ?');
|
|
$row->execute([$id]);
|
|
$data = $row->fetch(PDO::FETCH_ASSOC);
|
|
if (!$data) jsonError('Lugar no encontrado', 404);
|
|
// Incluir formularios de consentimiento vinculados
|
|
$stmtFc = db()->prepare('SELECT formulario_id FROM turnero_lugar_consentimientos WHERE lugar_id = ?');
|
|
$stmtFc->execute([$id]);
|
|
$data['formulario_ids'] = $stmtFc->fetchAll(PDO::FETCH_COLUMN);
|
|
jsonOk(['data' => $data]);
|
|
}
|
|
|
|
requireMethod('POST');
|
|
$input = inputJson();
|
|
|
|
$id = (int)($input['id'] ?? 0);
|
|
$delete = !empty($input['_delete']);
|
|
|
|
// ── ELIMINAR ─────────────────────────────────────────────────
|
|
if ($delete) {
|
|
if (!$id) jsonError('ID requerido');
|
|
// Bloquear si tiene turnos asignados
|
|
$stmt = db()->prepare('SELECT COUNT(*) FROM turnero_turnos WHERE lugar_destino_id = ?');
|
|
$stmt->execute([$id]);
|
|
if ($stmt->fetchColumn() > 0) {
|
|
jsonError('No se puede eliminar: tiene turnos asignados. Desactívelo en su lugar.');
|
|
}
|
|
$stmt = db()->prepare('DELETE FROM turnero_lugares WHERE id = ?');
|
|
$stmt->execute([$id]);
|
|
(new ActividadAdmin())->registrar(adminId(), 'turnero_config', 'eliminar_lugar', $id, ['lugar_id' => $id]);
|
|
jsonOk([], 'Lugar eliminado');
|
|
}
|
|
|
|
// ── CREAR / ACTUALIZAR ───────────────────────────────────────
|
|
$nombre = trim($input['nombre'] ?? '');
|
|
$desc = trim($input['descripcion'] ?? '');
|
|
$sortOrder = (int)($input['sort_order'] ?? 99);
|
|
$activo = (int)($input['activo'] ?? 1);
|
|
$tipo = in_array($input['tipo'] ?? '', ['recepcion', 'muestras'], true)
|
|
? $input['tipo'] : 'muestras';
|
|
$formModo = in_array($input['formulario_modo'] ?? '', ['link', 'embebido'], true)
|
|
? $input['formulario_modo'] : 'link';
|
|
$formularioIds = isset($input['formulario_ids']) && is_array($input['formulario_ids'])
|
|
? array_filter(array_map('intval', $input['formulario_ids']), fn($v) => $v > 0)
|
|
: [];
|
|
|
|
if ($nombre === '') jsonError('El nombre es requerido');
|
|
if ($sortOrder < 1) jsonError('El orden debe ser mayor a 0');
|
|
|
|
$pdo = db();
|
|
$pdo->beginTransaction();
|
|
try {
|
|
if ($id) {
|
|
$stmt = $pdo->prepare(
|
|
'UPDATE turnero_lugares SET nombre=?, tipo=?, descripcion=?, sort_order=?, activo=?, formulario_modo=? WHERE id=?'
|
|
);
|
|
$stmt->execute([$nombre, $tipo, $desc ?: null, $sortOrder, $activo, $formModo, $id]);
|
|
$lugarId = $id;
|
|
} else {
|
|
$stmt = $pdo->prepare(
|
|
'INSERT INTO turnero_lugares (nombre, tipo, descripcion, sort_order, activo, formulario_modo) VALUES (?, ?, ?, ?, ?, ?)'
|
|
);
|
|
$stmt->execute([$nombre, $tipo, $desc ?: null, $sortOrder, $activo, $formModo]);
|
|
$lugarId = (int) $pdo->lastInsertId();
|
|
}
|
|
|
|
// Sincronizar formularios de consentimiento
|
|
$pdo->prepare('DELETE FROM turnero_lugar_consentimientos WHERE lugar_id = ?')->execute([$lugarId]);
|
|
if (!empty($formularioIds)) {
|
|
$stmtIns = $pdo->prepare(
|
|
'INSERT IGNORE INTO turnero_lugar_consentimientos (lugar_id, formulario_id) VALUES (?, ?)'
|
|
);
|
|
foreach ($formularioIds as $fid) {
|
|
$stmtIns->execute([$lugarId, $fid]);
|
|
}
|
|
}
|
|
|
|
$pdo->commit();
|
|
|
|
// Auditoría: registrar quién guardó el lugar y con qué formularios
|
|
try {
|
|
$fNombres = [];
|
|
if (!empty($formularioIds)) {
|
|
$ph = implode(',', array_fill(0, count($formularioIds), '?'));
|
|
$fNombres = db()->prepare("SELECT id, nombre FROM lab_formularios WHERE id IN ($ph)");
|
|
$fNombres->execute(array_values($formularioIds));
|
|
$fNombres = $fNombres->fetchAll(PDO::FETCH_KEY_PAIR);
|
|
}
|
|
(new ActividadAdmin())->registrar(
|
|
adminId(),
|
|
'turnero_config',
|
|
$id ? 'editar_lugar' : 'crear_lugar',
|
|
$lugarId,
|
|
['nombre' => $nombre, 'tipo' => $tipo, 'activo' => $activo, 'formularios' => $fNombres]
|
|
);
|
|
} catch (\Throwable $_) {}
|
|
|
|
jsonOk(['id' => $lugarId], $id ? 'Lugar actualizado' : 'Lugar creado');
|
|
} catch (\Throwable $e) {
|
|
$pdo->rollBack();
|
|
jsonError('Error al guardar lugar: ' . $e->getMessage(), 500);
|
|
}
|