Files
whatsapp/modules/turnero/api/save_lugar.php
T
2026-04-22 09:03:43 -05:00

96 lines
3.8 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';
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]);
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';
$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=? WHERE id=?'
);
$stmt->execute([$nombre, $tipo, $desc ?: null, $sortOrder, $activo, $id]);
$lugarId = $id;
} else {
$stmt = $pdo->prepare(
'INSERT INTO turnero_lugares (nombre, tipo, descripcion, sort_order, activo) VALUES (?, ?, ?, ?, ?)'
);
$stmt->execute([$nombre, $tipo, $desc ?: null, $sortOrder, $activo]);
$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();
jsonOk(['id' => $lugarId], $id ? 'Lugar actualizado' : 'Lugar creado');
} catch (\Throwable $e) {
$pdo->rollBack();
jsonError('Error al guardar lugar: ' . $e->getMessage(), 500);
}