query("SELECT id, nombre FROM ciudades ORDER BY nombre"); $ciudades = $stmt_ciudades->fetchAll(PDO::FETCH_ASSOC); } catch (PDOException $e) { die("Error al obtener las ciudades: " . $e->getMessage()); } // Obtener todos los productos para el filtro try { $stmt_productos = db()->query("SELECT id, nombre FROM productos ORDER BY nombre"); $productos = $stmt_productos->fetchAll(PDO::FETCH_ASSOC); } catch (PDOException $e) { die("Error al obtener los productos: " . $e->getMessage()); } // Filtrar por ciudad y/o producto si se han seleccionado $ciudad_seleccionada_id = isset($_GET['ciudad_id']) ? (int)$_GET['ciudad_id'] : 0; $producto_seleccionado_id = isset($_GET['producto_id']) ? (int)$_GET['producto_id'] : 0; // Consulta para obtener el historial de movimientos try { $sql = " SELECT m.id, p.nombre AS producto_nombre, m.tipo AS tipo_movimiento, m.cantidad, COALESCE(c_origen.nombre, c_destino.nombre) AS ciudad_nombre, u.nombre AS usuario_nombre, m.fecha AS fecha_movimiento, m.fecha_registro, m.observacion FROM movimientos m JOIN productos p ON m.producto_id = p.id LEFT JOIN ciudades c_origen ON m.ciudad_origen_id = c_origen.id LEFT JOIN ciudades c_destino ON m.ciudad_destino_id = c_destino.id JOIN usuarios u ON m.usuario_id = u.id "; $conditions = []; $params = []; if ($ciudad_seleccionada_id > 0) { $conditions[] = "(c_origen.id = :ciudad_id OR c_destino.id = :ciudad_id)"; $params[':ciudad_id'] = $ciudad_seleccionada_id; } if ($producto_seleccionado_id > 0) { $conditions[] = "m.producto_id = :producto_id"; $params[':producto_id'] = $producto_seleccionado_id; } if (!empty($conditions)) { $sql .= " WHERE " . implode(" AND ", $conditions); } $sql .= " ORDER BY m.fecha_registro DESC"; $stmt = db()->prepare($sql); $stmt->execute($params); $movimientos = $stmt->fetchAll(PDO::FETCH_ASSOC); } catch (PDOException $e) { // En caso de un error de base de datos, muestra un mensaje en lugar de una página en blanco die("Error al obtener el historial de movimientos: " . $e->getMessage()); } ?>
| Producto | Tipo | Cantidad | Ciudad | Usuario | Fecha Movimiento | Fecha Registro | Observación |
|---|---|---|---|---|---|---|---|
| ' . htmlspecialchars($tipo) . ''; ?> | format('d/m/Y')); } catch (Exception $e) { echo htmlspecialchars($movimiento['fecha_movimiento']); } ?> | setTimezone(new DateTimeZone('America/Lima')); echo htmlspecialchars($fecha->format('d/m/Y H:i')); } catch (Exception $e) { echo htmlspecialchars($movimiento['fecha_registro']); } ?> | |||||
| No hay movimientos registrados para los filtros seleccionados. | |||||||