prepare('INSERT IGNORE INTO cotacoes (ativo) VALUES (?)')->execute([$ativo]); $pdo->prepare('INSERT INTO cotacoes_acompanhamentos (usuario_id, ativo) VALUES (?, ?)') ->execute([$ao_usuario_id, $ativo]); header('Location: cotacoes.php?acompanhado=1'); exit; } catch (PDOException $e) { $erro = ($e->getCode() === '23000') ? ('Você já acompanha ' . $ativo . '.') : ('Erro ao salvar: ' . $e->getMessage()); } } } // Para de acompanhar (não mexe na cotação compartilhada, só na lista pessoal). if ($_SERVER['REQUEST_METHOD'] === 'POST' && ($_POST['acao'] ?? '') === 'parar') { $id = (int) ($_POST['id'] ?? 0); $pdo->prepare('DELETE FROM cotacoes_acompanhamentos WHERE id = ? AND usuario_id = ?')->execute([$id, $ao_usuario_id]); header('Location: cotacoes.php?parado=1'); exit; } // Atualiza o preço de um ativo na tabela única/global — vale para todo mundo // que acompanha esse ativo, não só para quem atualizou. Só deixamos atualizar // o preço de um ativo que o próprio usuário acompanha (evita alguém ficar // alterando cotação de ativo que nem apareceu pra ele na tela). if ($_SERVER['REQUEST_METHOD'] === 'POST' && ($_POST['acao'] ?? '') === 'atualizar_preco') { $ativo = strtoupper(trim($_POST['ativo'] ?? '')); $preco_bruto = trim($_POST['preco'] ?? ''); $preco = ao_cot_parse_decimal_br($preco_bruto); $stmtAcompanha = $pdo->prepare('SELECT 1 FROM cotacoes_acompanhamentos WHERE usuario_id = ? AND ativo = ?'); $stmtAcompanha->execute([$ao_usuario_id, $ativo]); if (!$stmtAcompanha->fetch()) { $erro = 'Você só pode atualizar o preço de ativos que você acompanha.'; } elseif ($preco === null || $preco <= 0) { $erro = 'Informe um preço válido (maior que zero).'; } else { $stmtAtual = $pdo->prepare('SELECT preco_atual FROM cotacoes WHERE ativo = ?'); $stmtAtual->execute([$ativo]); $preco_atual_antigo = (float) $stmtAtual->fetchColumn(); // Se é a primeira vez que alguém informa um preço para este ativo, não // dá pra calcular variação a partir de zero — começa "zerada" (0%) em // vez de mostrar um salto absurdo de +infinito. $preco_anterior = $preco_atual_antigo > 0 ? $preco_atual_antigo : $preco; $stmt = $pdo->prepare('UPDATE cotacoes SET preco_anterior = ?, preco_atual = ?, atualizado_por = ? WHERE ativo = ?'); $stmt->execute([$preco_anterior, $preco, $ao_usuario_id, $ativo]); header('Location: cotacoes.php?atualizado=1'); exit; } } if (isset($_GET['acompanhado'])) $sucesso = 'Ativo adicionado à sua lista de acompanhamento.'; if (isset($_GET['parado'])) $sucesso = 'Você parou de acompanhar esse ativo.'; if (isset($_GET['atualizado'])) $sucesso = 'Cotação atualizada — todo mundo que acompanha esse ativo já vê o novo preço.'; // Mantém o que foi digitado no formulário de "acompanhar" se deu erro. $ativo_digitado = ($_SERVER['REQUEST_METHOD'] === 'POST' && ($_POST['acao'] ?? '') === 'acompanhar') ? (string) ($_POST['ativo'] ?? '') : ''; // A lista de preços vem sempre da tabela "cotacoes" (única/global) — aqui só // filtramos para os ativos que ESTE usuário decidiu acompanhar. $stmt = $pdo->prepare( 'SELECT ca.id AS acompanhamento_id, c.ativo, c.preco_atual, c.preco_anterior, c.atualizado_em, c.atualizado_por, u.nome AS atualizado_por_nome FROM cotacoes_acompanhamentos ca INNER JOIN cotacoes c ON c.ativo = ca.ativo LEFT JOIN usuarios u ON u.id = c.atualizado_por WHERE ca.usuario_id = ? ORDER BY c.ativo' ); $stmt->execute([$ao_usuario_id]); $acompanhados = $stmt->fetchAll(); // Calcula a variação percentual de cada um e separa em altas (>= 0%) e // baixas (< 0%) para as duas grids pedidas. foreach ($acompanhados as &$a) { $anterior = (float) $a['preco_anterior']; $atual = (float) $a['preco_atual']; $a['tem_cotacao'] = $a['atualizado_por'] !== null; $a['variacao'] = $anterior > 0 ? (($atual - $anterior) / $anterior) * 100 : 0.0; } unset($a); $altas = array_values(array_filter($acompanhados, fn($a) => $a['variacao'] >= 0)); $baixas = array_values(array_filter($acompanhados, fn($a) => $a['variacao'] < 0)); usort($altas, fn($a, $b) => $b['variacao'] <=> $a['variacao']); usort($baixas, fn($a, $b) => $a['variacao'] <=> $b['variacao']); require __DIR__ . '/includes/header.php'; /** Uma linha da grid de cotações (compartilhada entre a grid de altas e a de baixas). */ function ao_cot_linha(array $a) { $classe = $a['variacao'] >= 0 ? 'ao-badge-alta' : 'ao-badge-baixa'; $seta = $a['variacao'] >= 0 ? '▲' : '▼'; ?> R$ sem cotação ainda % em

Cotações do dia

Acompanhar novo ativo

A cotação é compartilhada: qualquer pessoa que também acompanhe o ativo pode atualizar o preço, e todo mundo que o acompanha vê o valor mais recente.

Você ainda não está acompanhando nenhum ativo. Use o formulário acima para adicionar o primeiro.

Altas do dia
AtivoÚltimoVariaçãoÚltima atualização
Nenhum ativo em alta no momento.
Baixas do dia
AtivoÚltimoVariaçãoÚltima atualização
Nenhum ativo em baixa no momento.