'Acción no válida']); } } else { getColaboradores(); } break; case 'POST': if (isset($_GET['action'])) { switch ($_GET['action']) { case 'colaborador': createColaborador($request); break; case 'asignar_codigo': asignarCodigo($request); break; default: echo json_encode(['error' => 'Acción no válida']); } } break; case 'PUT': if (isset($_GET['action']) && $_GET['action'] === 'colaborador') { updateColaborador($request); } break; case 'DELETE': if (isset($_GET['action'])) { switch ($_GET['action']) { case 'colaborador': deleteColaborador($_GET['id']); break; case 'remover_codigo': removerCodigo($_GET['colaborador_id'], $_GET['codigo_id']); break; } } break; default: echo json_encode(['error' => 'Método no permitido']); } function getColaboradores() { global $pdo; try { $sql = "SELECT c.*, GROUP_CONCAT(ct.codigo ORDER BY ct.codigo ASC) as codigos_trabajo, GROUP_CONCAT(ct.id ORDER BY ct.codigo ASC) as codigos_ids FROM colaboradores c LEFT JOIN asignaciones_codigos ac ON c.id = ac.colaborador_id LEFT JOIN codigos_trabajo ct ON ac.codigo_trabajo_id = ct.id GROUP BY c.id ORDER BY c.nombre"; $stmt = $pdo->query($sql); $colaboradores = $stmt->fetchAll(); // Procesar los códigos de trabajo para cada colaborador foreach ($colaboradores as &$colaborador) { $colaborador['codigosTrabajo'] = $colaborador['codigos_trabajo'] ? explode(',', $colaborador['codigos_trabajo']) : []; $colaborador['codigosIds'] = $colaborador['codigos_ids'] ? explode(',', $colaborador['codigos_ids']) : []; unset($colaborador['codigos_trabajo']); unset($colaborador['codigos_ids']); } echo json_encode($colaboradores); } catch (Exception $e) { echo json_encode(['error' => $e->getMessage()]); } } function getCodigosTrabajo() { global $pdo; try { $stmt = $pdo->query("SELECT * FROM codigos_trabajo WHERE activo = 1 ORDER BY codigo"); $codigos = $stmt->fetchAll(); echo json_encode($codigos); } catch (Exception $e) { echo json_encode(['error' => $e->getMessage()]); } } function getEstadisticas() { global $pdo; try { // Total colaboradores $stmt = $pdo->query("SELECT COUNT(*) as total FROM colaboradores"); $totalColaboradores = $stmt->fetch()['total']; // Total códigos $stmt = $pdo->query("SELECT COUNT(*) as total FROM codigos_trabajo WHERE activo = 1"); $totalCodigos = $stmt->fetch()['total']; // Códigos asignados (total de asignaciones) $stmt = $pdo->query("SELECT COUNT(*) as total FROM asignaciones_codigos"); $codigosAsignados = $stmt->fetch()['total']; // Códigos únicos asignados $stmt = $pdo->query("SELECT COUNT(DISTINCT codigo_trabajo_id) as total FROM asignaciones_codigos"); $codigosUnicosAsignados = $stmt->fetch()['total']; $codigosPorAsignar = $totalCodigos - $codigosUnicosAsignados; echo json_encode([ 'totalColaboradores' => $totalColaboradores, 'totalCodigos' => $totalCodigos, 'codigosAsignados' => $codigosAsignados, 'codigosPorAsignar' => $codigosPorAsignar ]); } catch (Exception $e) { echo json_encode(['error' => $e->getMessage()]); } } function createColaborador($data) { global $pdo; try { $pdo->beginTransaction(); $sql = "INSERT INTO colaboradores (codigo, nombre, telefono, departamento) VALUES (?, ?, ?, ?)"; $stmt = $pdo->prepare($sql); $stmt->execute([ $data['codigo'], $data['nombre'], $data['telefono'], $data['departamento'] ]); $colaboradorId = $pdo->lastInsertId(); $pdo->commit(); echo json_encode(['success' => true, 'id' => $colaboradorId]); } catch (Exception $e) { $pdo->rollBack(); echo json_encode(['error' => $e->getMessage()]); } } function updateColaborador($data) { global $pdo; try { $sql = "UPDATE colaboradores SET codigo = ?, nombre = ?, telefono = ?, departamento = ? WHERE id = ?"; $stmt = $pdo->prepare($sql); $stmt->execute([ $data['codigo'], $data['nombre'], $data['telefono'], $data['departamento'], $data['id'] ]); echo json_encode(['success' => true]); } catch (Exception $e) { echo json_encode(['error' => $e->getMessage()]); } } function deleteColaborador($id) { global $pdo; try { $sql = "DELETE FROM colaboradores WHERE id = ?"; $stmt = $pdo->prepare($sql); $stmt->execute([$id]); echo json_encode(['success' => true]); } catch (Exception $e) { echo json_encode(['error' => $e->getMessage()]); } } function asignarCodigo($data) { global $pdo; try { // Verificar que el colaborador no tenga más de 10 códigos $stmt = $pdo->prepare("SELECT COUNT(*) as total FROM asignaciones_codigos WHERE colaborador_id = ?"); $stmt->execute([$data['colaborador_id']]); $totalCodigos = $stmt->fetch()['total']; if ($totalCodigos >= 10) { echo json_encode(['error' => 'Un colaborador no puede tener más de 10 códigos']); return; } $sql = "INSERT INTO asignaciones_codigos (colaborador_id, codigo_trabajo_id) VALUES (?, ?)"; $stmt = $pdo->prepare($sql); $stmt->execute([$data['colaborador_id'], $data['codigo_trabajo_id']]); echo json_encode(['success' => true]); } catch (Exception $e) { if (strpos($e->getMessage(), 'Duplicate entry') !== false) { echo json_encode(['error' => 'Este código ya está asignado a este colaborador']); } else { echo json_encode(['error' => $e->getMessage()]); } } } function removerCodigo($colaboradorId, $codigoId) { global $pdo; try { $sql = "DELETE FROM asignaciones_codigos WHERE colaborador_id = ? AND codigo_trabajo_id = ?"; $stmt = $pdo->prepare($sql); $stmt->execute([$colaboradorId, $codigoId]); echo json_encode(['success' => true]); } catch (Exception $e) { echo json_encode(['error' => $e->getMessage()]); } } ?>