178 lines
8.2 KiB
PHP
178 lines
8.2 KiB
PHP
<?php
|
|
$titulo_pagina = 'Contas';
|
|
$pagina_ativa = 'contas';
|
|
|
|
require_once __DIR__ . '/includes/config.php';
|
|
require_once __DIR__ . '/includes/db.php';
|
|
require_once __DIR__ . '/includes/auth.php';
|
|
|
|
ao_exigir_permissao('contas');
|
|
|
|
// Cada usuário só vê e só mexe nas próprias contas — toda consulta sobre a
|
|
// tabela "contas" abaixo é sempre filtrada também por usuario_id. A
|
|
// corretora em si é um catálogo global (não é filtrada por usuário).
|
|
$ao_usuario_id = (int) ao_usuario_logado()['id'];
|
|
|
|
const AO_MAX_CONTAS_POR_CORRETORA = 3;
|
|
|
|
$erro = null;
|
|
$sucesso = null;
|
|
|
|
if ($_SERVER['REQUEST_METHOD'] === 'POST' && ($_POST['acao'] ?? '') === 'excluir') {
|
|
$id = (int) ($_POST['id'] ?? 0);
|
|
$stmt = $pdo->prepare('SELECT COUNT(*) FROM acoes WHERE conta_id = ? AND usuario_id = ?');
|
|
$stmt->execute([$id, $ao_usuario_id]);
|
|
if ((int) $stmt->fetchColumn() > 0) {
|
|
$erro = 'Não é possível excluir: esta conta já tem ações registradas nela.';
|
|
} else {
|
|
$pdo->prepare('DELETE FROM contas WHERE id = ? AND usuario_id = ?')->execute([$id, $ao_usuario_id]);
|
|
header('Location: contas.php?excluido=1');
|
|
exit;
|
|
}
|
|
}
|
|
|
|
if ($_SERVER['REQUEST_METHOD'] === 'POST' && ($_POST['acao'] ?? '') === 'salvar') {
|
|
$id = (int) ($_POST['id'] ?? 0);
|
|
$corretora_id = (int) ($_POST['corretora_id'] ?? 0);
|
|
$nome = trim($_POST['nome'] ?? '');
|
|
|
|
// A corretora é um catálogo global — só precisa existir, não precisa
|
|
// pertencer a este usuário.
|
|
$stmtCorretora = $pdo->prepare('SELECT id FROM corretoras WHERE id = ?');
|
|
$stmtCorretora->execute([$corretora_id]);
|
|
$corretoraValida = (bool) $stmtCorretora->fetch();
|
|
|
|
if ($nome === '' || !$corretoraValida) {
|
|
$erro = 'Selecione uma corretora válida e informe o nome da conta.';
|
|
} else {
|
|
// O limite de até 3 contas é por usuário dentro de cada corretora —
|
|
// não pelo total de contas de todo mundo naquela corretora.
|
|
$stmtCount = $pdo->prepare('SELECT COUNT(*) FROM contas WHERE corretora_id = ? AND usuario_id = ? AND id != ?');
|
|
$stmtCount->execute([$corretora_id, $ao_usuario_id, $id ?: 0]);
|
|
if ((int) $stmtCount->fetchColumn() >= AO_MAX_CONTAS_POR_CORRETORA) {
|
|
$erro = 'Esta corretora já tem o máximo de ' . AO_MAX_CONTAS_POR_CORRETORA . ' contas.';
|
|
} else {
|
|
try {
|
|
if ($id > 0) {
|
|
$stmt = $pdo->prepare('UPDATE contas SET corretora_id = ?, nome = ? WHERE id = ? AND usuario_id = ?');
|
|
$stmt->execute([$corretora_id, $nome, $id, $ao_usuario_id]);
|
|
} else {
|
|
$stmt = $pdo->prepare('INSERT INTO contas (corretora_id, usuario_id, nome) VALUES (?, ?, ?)');
|
|
$stmt->execute([$corretora_id, $ao_usuario_id, $nome]);
|
|
}
|
|
header('Location: contas.php?salvo=1');
|
|
exit;
|
|
} catch (PDOException $e) {
|
|
$erro = ($e->getCode() === '23000') ? 'Essa corretora já tem uma conta com esse nome.' : ('Erro ao salvar: ' . $e->getMessage());
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
$editando = null;
|
|
if (isset($_GET['editar'])) {
|
|
$stmt = $pdo->prepare('SELECT * FROM contas WHERE id = ? AND usuario_id = ?');
|
|
$stmt->execute([(int) $_GET['editar'], $ao_usuario_id]);
|
|
$editando = $stmt->fetch() ?: null;
|
|
} elseif (isset($_GET['corretora'])) {
|
|
// Vindo de "Ver contas" em Corretoras: só pré-seleciona a corretora no formulário.
|
|
$editando = ['id' => 0, 'corretora_id' => (int) $_GET['corretora'], 'nome' => ''];
|
|
}
|
|
|
|
if ($_SERVER['REQUEST_METHOD'] === 'POST' && ($_POST['acao'] ?? '') === 'salvar' && $erro) {
|
|
$editando = ['id' => $id, 'corretora_id' => $corretora_id, 'nome' => $nome];
|
|
}
|
|
|
|
if (isset($_GET['salvo'])) $sucesso = 'Conta salva com sucesso.';
|
|
if (isset($_GET['excluido'])) $sucesso = 'Conta excluída.';
|
|
|
|
// Corretora é global: a lista de opções é a mesma para todos os usuários.
|
|
$stmtCorretoras = $pdo->query('SELECT id, nome FROM corretoras ORDER BY nome');
|
|
$corretoras = $stmtCorretoras->fetchAll();
|
|
|
|
$stmt = $pdo->prepare(
|
|
'SELECT ct.*, cr.nome AS corretora_nome, (SELECT COUNT(*) FROM acoes a WHERE a.conta_id = ct.id) AS total_acoes
|
|
FROM contas ct
|
|
INNER JOIN corretoras cr ON cr.id = ct.corretora_id
|
|
WHERE ct.usuario_id = ?
|
|
ORDER BY cr.nome, ct.nome'
|
|
);
|
|
$stmt->execute([$ao_usuario_id]);
|
|
$contas = $stmt->fetchAll();
|
|
|
|
require __DIR__ . '/includes/header.php';
|
|
?>
|
|
|
|
<h1 class="ao-page-title">Contas</h1>
|
|
|
|
<?php if ($erro): ?>
|
|
<div class="ao-badge ao-badge-baixa" style="display:block; margin-bottom: var(--ao-space-4); padding: 10px 14px; font-size: var(--ao-fs-sm);"><?= htmlspecialchars($erro) ?></div>
|
|
<?php endif; ?>
|
|
<?php if ($sucesso): ?>
|
|
<div class="ao-badge ao-badge-alta" style="display:block; margin-bottom: var(--ao-space-4); padding: 10px 14px; font-size: var(--ao-fs-sm);"><?= htmlspecialchars($sucesso) ?></div>
|
|
<?php endif; ?>
|
|
|
|
<?php if (!$corretoras): ?>
|
|
<div class="ao-card" style="max-width: 480px; margin-bottom: var(--ao-space-6);">
|
|
<p style="margin: 0;">Nenhuma corretora cadastrada ainda no sistema. <a href="corretoras.php">Cadastre uma corretora</a> antes de criar contas.</p>
|
|
</div>
|
|
<?php else: ?>
|
|
<div class="ao-card" style="max-width: 480px; margin-bottom: var(--ao-space-6);">
|
|
<div class="ao-card-header"><strong><?= $editando && !empty($editando['id']) ? 'Editar conta' : 'Nova conta' ?></strong></div>
|
|
<p style="color: var(--ao-text-muted); font-size: var(--ao-fs-sm); margin-top: 0;">Você pode ter até 3 contas suas em cada corretora.</p>
|
|
<form method="post" action="contas.php">
|
|
<input type="hidden" name="acao" value="salvar">
|
|
<input type="hidden" name="id" value="<?= (int) ($editando['id'] ?? 0) ?>">
|
|
<div class="ao-field" style="margin-bottom: var(--ao-space-4);">
|
|
<label for="corretora_id">Corretora</label>
|
|
<select id="corretora_id" name="corretora_id" required>
|
|
<option value="">Selecione...</option>
|
|
<?php foreach ($corretoras as $cr): ?>
|
|
<option value="<?= $cr['id'] ?>" <?= (isset($editando) && (int) ($editando['corretora_id'] ?? 0) === (int) $cr['id']) ? 'selected' : '' ?>><?= htmlspecialchars($cr['nome']) ?></option>
|
|
<?php endforeach; ?>
|
|
</select>
|
|
</div>
|
|
<div class="ao-field" style="margin-bottom: var(--ao-space-5);">
|
|
<label for="nome">Nome/apelido da conta</label>
|
|
<input type="text" id="nome" name="nome" placeholder="Ex: Conta principal" required
|
|
value="<?= htmlspecialchars($editando['nome'] ?? '') ?>">
|
|
</div>
|
|
<button type="submit" class="ao-btn ao-btn-primary"><?= $editando && !empty($editando['id']) ? 'Salvar alterações' : 'Cadastrar conta' ?></button>
|
|
<?php if ($editando): ?>
|
|
<a href="contas.php" class="ao-btn ao-btn-secondary">Cancelar</a>
|
|
<?php endif; ?>
|
|
</form>
|
|
</div>
|
|
<?php endif; ?>
|
|
|
|
<div class="ao-card">
|
|
<div class="ao-card-header"><strong>Contas cadastradas</strong></div>
|
|
<table class="ao-table">
|
|
<thead>
|
|
<tr><th>Corretora</th><th>Conta</th><th>Ações vinculadas</th><th></th></tr>
|
|
</thead>
|
|
<tbody>
|
|
<?php if (!$contas): ?>
|
|
<tr><td colspan="4" style="color: var(--ao-text-muted);">Nenhuma conta cadastrada ainda.</td></tr>
|
|
<?php endif; ?>
|
|
<?php foreach ($contas as $c): ?>
|
|
<tr>
|
|
<td><?= htmlspecialchars($c['corretora_nome']) ?></td>
|
|
<td><?= htmlspecialchars($c['nome']) ?></td>
|
|
<td class="ao-numeric"><?= (int) $c['total_acoes'] ?></td>
|
|
<td style="white-space: nowrap; text-align: right;">
|
|
<a href="contas.php?editar=<?= $c['id'] ?>" class="ao-btn ao-btn-secondary" style="padding: 4px 10px; font-size: var(--ao-fs-xs);">Editar</a>
|
|
<form method="post" action="contas.php" style="display:inline;" onsubmit="return confirm('Excluir esta conta?');">
|
|
<input type="hidden" name="acao" value="excluir">
|
|
<input type="hidden" name="id" value="<?= $c['id'] ?>">
|
|
<button type="submit" class="ao-btn ao-btn-secondary" style="padding: 4px 10px; font-size: var(--ao-fs-xs);">Excluir</button>
|
|
</form>
|
|
</td>
|
|
</tr>
|
|
<?php endforeach; ?>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
|
|
<?php require __DIR__ . '/includes/footer.php'; ?>
|