home
/
u529748449
/
domains
/
borabilhete.com
/
public_html
/
public
➕ New
📤 Upload
✎ Editing:
template_evento.php
← Back
<?php session_start(); $esta_editando = isset($_GET['editar']) && $_GET['editar'] == '1'; // Só zera a sessão se NÃO estiver editando if ($_SERVER['REQUEST_METHOD'] === 'GET' && !$esta_editando) { unset($_SESSION['dados_compra']); } $dados_sessao = $_SESSION['dados_compra'] ?? []; $setores_sessao = $dados_sessao['setor_id'] ?? []; $quantidades_sessao = $dados_sessao['quantidade'] ?? []; error_reporting(E_ALL); ini_set('display_errors', 1); include __DIR__ . '/../admin/conexao.php'; if (!isset($id_evento)) { $id_evento = isset($_GET['id_evento']) ? intval($_GET['id_evento']) : 0; } $sql = "SELECT * FROM eventos WHERE id = ?"; $stmt = $conn->prepare($sql); $stmt->bind_param("i", $id_evento); $stmt->execute(); $result = $stmt->get_result(); $evento = $result->fetch_assoc(); if (!$evento) { echo "Evento não encontrado."; exit; } // --- Produtora do evento (via produtor -> produtora) --- $produtora = null; if (!empty($evento['produtor_id'])) { $sqlP = " SELECT emp.nome_fantasia, emp.instagram, emp.logo FROM produtores p LEFT JOIN produtoras emp ON emp.id = p.empresa_id WHERE p.id = ? LIMIT 1 "; $stP = $conn->prepare($sqlP); $stP->bind_param('i', $evento['produtor_id']); $stP->execute(); $produtora = $stP->get_result()->fetch_assoc(); $stP->close(); } // Helpers para exibir instagram e resolver a URL da logo function insta_url(?string $raw): ?array { if (!$raw) return null; $h = trim($raw); // extrai apenas o handle (remove url completa e '@') $h = preg_replace('~^https?://(www\.)?instagram\.com/~i', '', $h); $h = trim($h, " \t\n\r\0\x0B@/"); if ($h === '') return null; return [ 'handle' => '@' . $h, 'url' => 'https://instagram.com/' . $h ]; } function logo_url_web(?string $stored) { if (!$stored) return null; // Se já for URL absoluta if (preg_match('~^https?://~i', $stored)) return $stored; // Tenta localizar em /admin/uploads/produtoras (onde salvamos no painel) $fsAdmin = __DIR__ . '/../admin/' . ltrim($stored, '/'); if (file_exists($fsAdmin)) { // evento/* está 2 níveis abaixo da raiz do site, então volta e entra em /admin return '../../admin/' . ltrim($stored, '/'); } // Tentativa: caminho relativo ao /public (caso mude no futuro) $fsPublic = __DIR__ . '/' . ltrim($stored, '/'); if (file_exists($fsPublic)) { return './' . ltrim($stored, '/'); } // fallback (deixa como veio) return $stored; } // === Taxa por evento === // Se não houver configuração, cai no padrão 9% (retrocompatível) $taxa_tipo = $evento['taxa_tipo'] ?? null; // 'percentual' | 'fixa' | null $taxa_percentual = isset($evento['taxa_percentual']) ? (float)$evento['taxa_percentual'] : null; // ex.: 9.00 $taxa_valor = isset($evento['taxa_valor']) ? (float)$evento['taxa_valor'] : null; // ex.: 2.50 function taxa_unitaria(float $preco, ?string $tipo, ?float $perc, ?float $fixo): float { if ($tipo === 'fixa' && $fixo !== null) { return round(max(0, $fixo), 2); } // percentual (ou null => padrão 9%) $p = ($tipo === 'percentual' && $perc !== null) ? ($perc / 100.0) : 0.09; return round(max(0, $preco * $p), 2); } $setores = $conn->query("SELECT * FROM setores WHERE id_evento = $id_evento"); ?> <!DOCTYPE html> <html lang="pt-BR"> <head> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta charset="UTF-8"> <title><?php echo $evento['nome']; ?> - Ingressos</title> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.0/css/all.min.css" crossorigin="anonymous" referrerpolicy="no-referrer" /> <link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> <link href="https://fonts.googleapis.com/css2?family=Poppins:wght@300;400;500;600;700&display=swap" rel="stylesheet"> <link rel="stylesheet" href="../../public/css/baseingressos.css"> <link rel="stylesheet" href="../../public/css/evento.css"> <link rel="stylesheet" href="../../public/css/header.css"> <link rel="stylesheet" href="../../public/css/footer.css"> </head> <body> <?php include __DIR__ . '/includes/header.php'; ?> <div class="container"> <div class="evento-header-horizontal"> <div class="evento-infos"> <h1><?php echo $evento['nome']; ?></h1> <p><i class="fa-solid fa-calendar-days"></i> <?php echo date('d/m/Y', strtotime($evento['data'])); ?></p> <p><i class="fa-solid fa-clock"></i> <?php echo date('H:i', strtotime($evento['data'])); ?></p> <p><i class="fa-solid fa-location-dot"></i> <?php echo $evento['local']; ?></p> </div> <div class="imagem-topo-lateral"> <?php if (!empty($evento['imagem_topo']) && file_exists(__DIR__ . '/../public/' . $evento['imagem_topo'])): ?> <img src="../../public/<?php echo $evento['imagem_topo']; ?>" alt="Imagem do Evento"> <?php else: ?> <img src="https://via.placeholder.com/300x400?text=Imagem+do+Evento" alt="Imagem do Evento"> <?php endif; ?> </div> </div> <div class="setores"> <div class="setores-head"> <h2><i class="fa-solid fa-ticket"></i> Áreas</h2> <?php if (!empty($evento['imagem_mapa']) && file_exists(__DIR__ . '/../public/' . $evento['imagem_mapa'])): ?> <button type="button" class="btn-ver-mapa" onclick="abrirModalMapa()"> <i class="fa-solid fa-map"></i> Ver Mapa Evento </button> <?php endif; ?> </div> <form id="form-comprar" method="POST" action="../../public/login.php"> <input type="hidden" name="id_evento" value="<?php echo $evento['id']; ?>"> <div class="tabela-setores"> <div class="cabecalho"> <div>Área</div> <div>Quantidade</div> <div>Valor</div> <div>Taxa</div> <div>Subtotal</div> </div> <?php date_default_timezone_set('America/Sao_Paulo'); $agora = date('Y-m-d H:i:s'); while ($s = $setores->fetch_assoc()): if (!empty($s['inicio_vendas']) && $agora < $s['inicio_vendas']) continue; if (!empty($s['fim_vendas']) && $agora > $s['fim_vendas']) continue; $id = (int)$s['id']; $nome = $s['nome_setor']; $precoFloat = (float)$s['preco']; $taxaUnitFloat = taxa_unitaria($precoFloat, $taxa_tipo, $taxa_percentual, $taxa_valor); $preco = number_format($precoFloat, 2, ',', '.'); $taxa = number_format($taxaUnitFloat, 2, ',', '.'); $quantidadePreenchida = 0; if (!empty($setores_sessao)) { foreach ($setores_sessao as $index => $id_setor_sessao) { if ((int)$id_setor_sessao === $id) { $quantidadePreenchida = max(0, (int)$quantidades_sessao[$index]); break; } } } $valorTotal = ($precoFloat + $taxaUnitFloat) * $quantidadePreenchida; ?> <div class="linha-setor"> <div class="col-area"> <strong><?php echo htmlspecialchars($nome); ?></strong> <?php if (!empty($s['descricao'])): ?> <small class="descricao-setor"><?php echo htmlspecialchars($s['descricao']); ?></small> <?php endif; ?> <input type="hidden" name="setor_id[]" value="<?php echo $id; ?>"> </div> <div class="col-quantidade"> <button type="button" onclick="alterarQtd(<?php echo $id; ?>, -1)">-</button> <input type="number" id="qtd_<?php echo $id; ?>" name="quantidade[]" value="<?php echo $quantidadePreenchida; ?>" min="0" readonly> <button type="button" onclick="alterarQtd(<?php echo $id; ?>, 1)">+</button> </div> <div>R$ <?php echo $preco; ?></div> <div>R$ <?php echo $taxa; ?></div> <div id="total_<?php echo $id; ?>">R$ <?php echo number_format($valorTotal, 2, ',', '.'); ?></div> <div class="valores-mobile"> <div class="linha-valores"> <strong>Valor+Taxa:</strong> <span class="unitario-mobile" data-id="<?php echo $id; ?>"> R$ <?php echo number_format($precoFloat + $taxaUnitFloat, 2, ',', '.'); ?> </span> <strong style="margin-left:4px;">Subtotal:</strong> <span class="total-mobile" data-id="<?php echo $id; ?>"> R$ <?php echo number_format($valorTotal, 2, ',', '.'); ?> </span> </div> </div> </div> <?php endwhile; ?> </div> <!-- Footer do box: Total + Botão, lado a lado e centralizados --> <div class="compra-cta"> <div class="total-geral"> <strong>Total:</strong> <?php $totalGeral = 0; if (!empty($setores_sessao)) { foreach ($setores_sessao as $index => $id_setor_sessao) { $qtd = (int)$quantidades_sessao[$index]; if ($qtd <= 0) continue; $stmt = $conn->prepare("SELECT preco FROM setores WHERE id = ?"); $stmt->bind_param("i", $id_setor_sessao); $stmt->execute(); $res = $stmt->get_result(); if ($row = $res->fetch_assoc()) { $precoItem = (float)$row['preco']; $taxaItem = taxa_unitaria($precoItem, $taxa_tipo, $taxa_percentual, $taxa_valor); $totalGeral += ($precoItem + $taxaItem) * $qtd; } } } ?> <span id="valor_total_geral">R$ <?php echo number_format($totalGeral, 2, ',', '.'); ?></span> </div> <button type="button" class="btn-comprar" onclick="salvarCarrinhoERedirecionar()"> <i class="fa-solid fa-cart-shopping"></i> Comprar </button> </div> <div id="erro-mensagem" style="color: red; margin-top: 10px; display: none;"> Selecione pelo menos 1 ingresso para continuar. </div> </form> </div> <!-- Toggle para Descrição --> <div class="accordion-box"> <div class="accordion-header" onclick="toggleDescricao(this)"> <span class="accordion-icon">+</span> <span>Informações</span> </div> <div class="accordion-content" id="descricaoCompleta"> <?php echo nl2br($evento['descricao']); ?> </div> </div> <?php if (!empty($evento['imagem_mapa']) && file_exists(__DIR__ . '/../public/' . $evento['imagem_mapa'])): ?> <div id="modalMapa" class="modal"> <span class="modal-close" onclick="fecharModalMapa()">×</span> <img class="modal-content" src="../../public/<?php echo $evento['imagem_mapa']; ?>" alt="Mapa do Evento"> </div> <?php endif; ?> <?php $temProdutora = $produtora && ( !empty($produtora['nome_fantasia']) || !empty($produtora['instagram']) || !empty($produtora['logo']) ); if ($temProdutora): $logoWeb = logo_url_web($produtora['logo'] ?? null); $instaData = insta_url($produtora['instagram'] ?? null); ?> <div class="produtora-section"> <div class="produtora-card"> <?php if ($logoWeb): ?> <div class="produtora-logo"> <img src="<?= htmlspecialchars($logoWeb) ?>" alt="Logo da produtora"> </div> <?php endif; ?> <div class="produtora-info"> <div class="produtora-label">Produção</div> <div class="produtora-name"> <?= htmlspecialchars($produtora['nome_fantasia'] ?? 'Produtora') ?> </div> <?php if ($instaData): ?> <a class="produtora-ig" href="<?= htmlspecialchars($instaData['url']) ?>" target="_blank" rel="noopener"> <i class="fa-brands fa-instagram"></i> <?= htmlspecialchars($instaData['handle']) ?> </a> <?php endif; ?> </div> </div> </div> <?php endif; ?> </div> <?php include __DIR__ . '/footer.php'; ?> <script> const TAXA_CFG = <?= json_encode([ 'tipo' => $taxa_tipo ?: 'percentual', 'perc' => $taxa_percentual !== null ? (float)$taxa_percentual : 9.00, 'fixo' => $taxa_valor !== null ? (float)$taxa_valor : 0.00 ], JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES); ?>; function taxaUnit(preco){ if (TAXA_CFG.tipo === 'fixa') { return Number(TAXA_CFG.fixo.toFixed(2)); } // percentual (padrão 9% se não configurado) const p = (typeof TAXA_CFG.perc === 'number') ? TAXA_CFG.perc : 9.00; return Number((preco * (p/100)).toFixed(2)); } function parsePreco(text) { return parseFloat( text.replace('R$', '').replace(/\./g, '').replace(',', '.').trim() ) || 0; } function alterarQtd(id, delta) { const input = document.getElementById("qtd_" + id); let atual = parseInt(input.value || "0", 10); atual += delta; if (atual < 0) atual = 0; input.value = atual; const linha = input.closest(".linha-setor"); const precoText = linha.querySelectorAll("div")[2].innerText; const preco = parsePreco(precoText); const taxaUnitValue = taxaUnit(preco); const total = (preco + taxaUnitValue) * atual; document.getElementById("total_" + id).innerText = "R$ " + total.toFixed(2).replace('.', ','); const totalMobile = document.querySelector(".total-mobile[data-id='" + id + "']"); if (totalMobile) { totalMobile.innerText = "R$ " + total.toFixed(2).replace('.', ','); } atualizarTotalGeral(); } function atualizarTotalGeral() { let totalGeral = 0; document.querySelectorAll(".linha-setor").forEach(linha => { const qtdInput = linha.querySelector('input[type="number"]'); const qtd = parseInt(qtdInput.value || "0", 10); if (qtd <= 0) return; const precoText = linha.querySelectorAll("div")[2].innerText; const preco = parsePreco(precoText); const taxaUnitValue = taxaUnit(preco); totalGeral += (preco + taxaUnitValue) * qtd; }); document.getElementById("valor_total_geral").innerText = "R$ " + totalGeral.toFixed(2).replace('.', ','); } document.getElementById("form-comprar").addEventListener("submit", function(e) { let totalSelecionado = 0; document.querySelectorAll(".linha-setor input[type='number']").forEach(input => { totalSelecionado += parseInt(input.value || "0", 10); }); if (totalSelecionado === 0) { e.preventDefault(); document.getElementById("erro-mensagem").style.display = "block"; } else { document.getElementById("erro-mensagem").style.display = "none"; } }); // ====== MODAL DO MAPA ====== const modal = document.getElementById('modalMapa'); function abrirModalMapa(){ if (!modal) return; modal.style.display = 'block'; document.body.classList.add('no-scroll'); // evita rolagem do fundo } function fecharModalMapa(){ if (!modal) return; modal.style.display = 'none'; document.body.classList.remove('no-scroll'); } // Fecha ao clicar no fundo escuro (overlay) if (modal) { modal.addEventListener('click', function(e){ // só fecha quando o clique for no overlay (fora da imagem / X) if (e.target === modal) fecharModalMapa(); }); } // Fecha com a tecla ESC document.addEventListener('keydown', function(e){ if (e.key === 'Escape' && modal && modal.style.display === 'block') { fecharModalMapa(); } }); function salvarCarrinhoERedirecionar() { const form = document.getElementById('form-comprar'); const formData = new FormData(form); let totalSelecionado = 0; form.querySelectorAll("input[type='number']").forEach(input => { totalSelecionado += parseInt(input.value || "0", 10); }); if (totalSelecionado === 0) { document.getElementById("erro-mensagem").style.display = "block"; return; } fetch('../../public/salvar_dados_compra.php', { method: 'POST', body: formData, credentials: 'same-origin' }).then(response => { if (response.ok) { fetch('../../public/verificar_login.php', { credentials: 'same-origin' }) .then(resp => resp.text()) .then(logado => { if (logado === 'logado') { window.location.href = "../../public/comprar.php"; } else { window.location.href = "../../public/login.php"; } }); } else { alert("Erro ao salvar o carrinho."); } }).catch(err => { console.error("Erro:", err); alert("Erro ao salvar o carrinho."); }); } function toggleDescricao(header) { const icon = header.querySelector(".accordion-icon"); const content = header.nextElementSibling; const isActive = header.classList.toggle("active"); content.style.display = isActive ? "block" : "none"; } </script> </body> </html>
💾 Save Changes
Cancel
📤 Upload File
×
Select File
Upload
Cancel
➕ Create New
×
Type
📄 File
📁 Folder
Name
Create
Cancel
✎ Rename Item
×
Current Name
New Name
Rename
Cancel
🔐 Change Permissions
×
Target File
Permission (e.g., 0755, 0644)
0755
0644
0777
Apply
Cancel