diff --git a/db/migrations/049_create_sedes_table.sql b/db/migrations/049_create_sedes_table.sql new file mode 100644 index 0000000..e513340 --- /dev/null +++ b/db/migrations/049_create_sedes_table.sql @@ -0,0 +1,5 @@ +CREATE TABLE IF NOT EXISTS sedes ( + id INT AUTO_INCREMENT PRIMARY KEY, + nombre VARCHAR(255) NOT NULL, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP +); diff --git a/panel_inventario.php b/panel_inventario.php index 5ea8121..d7b579d 100644 --- a/panel_inventario.php +++ b/panel_inventario.php @@ -1,180 +1,356 @@ -prepare("SELECT COUNT(*) FROM products WHERE nombre = ?"); - $stmt->execute([$nombre_producto]); - if ($stmt->fetchColumn() > 0) { - $message = "Error: El producto '{$nombre_producto}' ya existe."; - $message_type = "danger"; - } else { - // Insert new product with default values - $stmt = $pdo->prepare("INSERT INTO products (nombre, unidades_disponibles, cobertura, show_on_panel, order_position) VALUES (?, 0, '[]', 1, 0)"); - if ($stmt->execute([$nombre_producto])) { - $message = "Producto '{$nombre_producto}' registrado con éxito."; - $message_type = "success"; - } else { - $message = "Error al registrar el producto."; - $message_type = "danger"; - } - } + $sql = "INSERT INTO sedes (nombre) VALUES (:nombre)"; + $stmt = $conn->prepare($sql); + $stmt->bindParam(':nombre', $nombre_sede); + $stmt->execute(); + $feedback = 'Sede añadida correctamente.'; + $feedback_type = 'success'; } catch (PDOException $e) { - $message = "Error de base de datos: " . $e->getMessage(); - $message_type = "danger"; + $feedback = 'Error al añadir la sede: ' . $e->getMessage(); + $feedback_type = 'danger'; } } else { - $message = "El nombre del producto no puede estar vacío."; - $message_type = "warning"; + $feedback = 'El nombre de la sede no puede estar vacío.'; + $feedback_type = 'warning'; + } +} + +// --- ELIMINAR SEDE --- +if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['delete_sede'])) { + $sede_id = $_POST['sede_id']; + try { + $sql = "DELETE FROM sedes WHERE id = :id"; + $stmt = $conn->prepare($sql); + $stmt->bindParam(':id', $sede_id, PDO::PARAM_INT); + $stmt->execute(); + $feedback = 'Sede eliminada correctamente.'; + $feedback_type = 'success'; + } catch (PDOException $e) { + $feedback = 'Error al eliminar la sede.'; + $feedback_type = 'danger'; + } +} + +// --- REGISTRAR ENTRADA DE INVENTARIO --- +if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['registrar_entrada'])) { + $producto_id = $_POST['producto_id']; + $cantidad = $_POST['cantidad']; + + if (!empty($producto_id) && !empty($cantidad) && is_numeric($cantidad) && $cantidad > 0) { + try { + $conn->beginTransaction(); + $stmt = $conn->prepare("UPDATE productos SET unidades_disponibles = unidades_disponibles + :cantidad WHERE id = :id"); + $stmt->bindParam(':cantidad', $cantidad, PDO::PARAM_INT); + $stmt->bindParam(':id', $producto_id, PDO::PARAM_INT); + $stmt->execute(); + $conn->commit(); + $feedback = 'Stock actualizado correctamente.'; + $feedback_type = 'success'; + } catch (PDOException $e) { + $conn->rollBack(); + $feedback = 'Error al actualizar el stock: ' . $e->getMessage(); + $feedback_type = 'danger'; + } + } else { + $feedback = 'Por favor, selecciona un producto e introduce una cantidad válida.'; + $feedback_type = 'warning'; + } +} + +// --- REGISTRAR NUEVO PRODUCTO --- +if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['registrar_producto'])) { + $nombre = trim($_POST['nombre']); + $unidades = (int)$_POST['unidades_disponibles']; + $precio = (float)$_POST['precio_unitario']; + $costo = (float)$_POST['costo_unitario']; + + if (!empty($nombre) && $unidades >= 0 && $precio >= 0 && $costo >= 0) { + try { + $sql = "INSERT INTO productos (nombre, unidades_disponibles, precio_unitario, costo_unitario) VALUES (:nombre, :unidades, :precio, :costo)"; + $stmt = $conn->prepare($sql); + $stmt->execute([':nombre' => $nombre, ':unidades' => $unidades, ':precio' => $precio, ':costo' => $costo]); + $feedback = 'Producto registrado correctamente.'; + $feedback_type = 'success'; + } catch (PDOException $e) { + $feedback = 'Error al registrar el producto: ' . $e->getMessage(); + $feedback_type = 'danger'; + } + } else { + $feedback = 'Por favor, completa todos los campos del producto correctamente.'; + $feedback_type = 'warning'; } } -// Set the title based on the section -switch ($seccion) { - case 'entrada': - $pageTitle = "Registro de Entrada"; - break; - case 'salida': - $pageTitle = "Registro de Salida"; - break; - case 'registro_producto': - $pageTitle = "Registro de Nuevo Producto"; - break; - case 'dashboard': - default: - $pageTitle = "Dashboard de Inventario"; - break; -} +// ======= OBTENCIÓN DE DATOS (GET) ======= +// --- DATOS PARA GRÁFICOS --- +$productos_por_agotarse = $conn->query("SELECT nombre, unidades_disponibles FROM productos WHERE unidades_disponibles > 0 ORDER BY unidades_disponibles ASC LIMIT 5")->fetchAll(PDO::FETCH_ASSOC); +$productos_mas_stock = $conn->query("SELECT nombre, unidades_disponibles FROM productos ORDER BY unidades_disponibles DESC LIMIT 5")->fetchAll(PDO::FETCH_ASSOC); + +// --- LISTA DE TODOS LOS PRODUCTOS --- +$productos = $conn->query("SELECT * FROM productos ORDER BY nombre ASC")->fetchAll(PDO::FETCH_ASSOC); + +// --- LISTA DE SEDES --- +$sedes = $conn->query("SELECT * FROM sedes ORDER BY nombre ASC")->fetchAll(PDO::FETCH_ASSOC); + +$pageTitle = "Panel de Inventario"; +include 'layout_header.php'; ?> -
- -