strtotime($fecha_actual)) { die("Error: La fecha ingresada no puede ser del futuro."); } if (!empty($producto_id) && !empty($tipo) && !empty($cantidad) && is_numeric($cantidad)) { if ($tipo === 'entrada' && (!is_numeric($precio_unitario) || $precio_unitario <= 0)) { $mensaje = "El precio debe ser numérico y mayor que cero para entradas."; } else { // Insertar movimiento $stmt = $conn->prepare("INSERT INTO movimientos (producto_id, tipo, cantidad, precio_unitario, fecha) VALUES (?, ?, ?, ?, ?)"); if (!$stmt) { die("Error al preparar INSERT en movimientos: " . $conn->error); } $stmt->bind_param("isids", $producto_id, $tipo, $cantidad, $precio_unitario, $fecha); $stmt->execute(); // Insertar también en historial $stmt_hist = $conn->prepare("INSERT INTO historial (producto_id, tipo, cantidad, precio_unitario, fecha) VALUES (?, ?, ?, ?, ?)"); if (!$stmt_hist) { die("Error al preparar INSERT en historial: " . $conn->error); } if ($_SERVER["REQUEST_METHOD"] == "POST") { // Procesa la solicitud POST, inserta o actualiza los movimientos, etc. // ... // Supongamos que en algún momento se asigna: $mensaje = "Movimiento registrado correctamente."; // Al final, redirige para evitar que se reenvíe el POST al refrescar: header("Location: registrar_movimiento.html?mensaje=" . urlencode($mensaje)); exit(); } $stmt_hist->bind_param("isids", $producto_id, $tipo, $cantidad, $precio_unitario, $fecha); $stmt_hist->execute(); // Actualizar stock if ($tipo === 'entrada') { $conn->query("UPDATE productos SET stock = stock + $cantidad WHERE id = $producto_id"); $mensaje = "Entrada registrada correctamente."; } else { $conn->query("UPDATE productos SET stock = stock - $cantidad WHERE id = $producto_id"); $mensaje = "Salida registrada correctamente."; } } } else { $mensaje = "Todos los campos son obligatorios y deben ser válidos."; } } // Obtener productos $resultado = $conn->query("SELECT id, nombre FROM productos ORDER BY nombre ASC"); ?> Registro De Movimiento

Registro De Entrada / Salida


Volver al Inicio