One Hat Cyber Team
Your IP :
216.73.216.36
Server IP :
162.240.179.46
Server :
Linux vps-14493116.nutrivittasaude.com.br 5.14.0-611.49.1.el9_7.x86_64 #1 SMP PREEMPT_DYNAMIC Tue Apr 21 16:39:08 EDT 2026 x86_64
Server Software :
Apache
PHP Version :
8.2.31
Buat File
|
Buat Folder
Eksekusi
Dir :
~
/
home
/
lifeprimeti
/
meta.lifeprimeti.com.br
/
Edit File:
register.php
<?php require_once __DIR__ . '/config/database.php'; if (isAuthenticated()) { redirect(URL_BASE . 'public/dashboard.php'); } $error = ''; $success = ''; $planos = $pdo->query("SELECT * FROM planos WHERE ativo = 1 ORDER BY valor ASC")->fetchAll(); $gatewayNomes = ['hubpay'=>'Hubpay', 'mercadopago'=>'Mercado Pago', 'asaas'=>'Asaas', 'manual'=>'Manual (aprovacao)']; if ($_SERVER['REQUEST_METHOD'] === 'POST') { $nome = trim($_POST['nome'] ?? ''); $email = trim($_POST['email'] ?? ''); $telefone = trim($_POST['telefone'] ?? ''); $senha = $_POST['senha'] ?? ''; $confirmar_senha = $_POST['confirmar_senha'] ?? ''; $empresa_nome = trim($_POST['empresa_nome'] ?? ''); $plano_id = (int)($_POST['plano_id'] ?? 0); $payment_gateway = $_POST['payment_gateway'] ?? ''; if (empty($nome) || empty($email) || empty($senha) || empty($empresa_nome)) { $error = 'Preencha todos os campos obrigatorios.'; } elseif (empty($payment_gateway)) { $error = 'Escolha um meio de pagamento.'; } elseif ($senha !== $confirmar_senha) { $error = 'As senhas nao conferem.'; } elseif (strlen($senha) < 6) { $error = 'A senha deve ter no minimo 6 caracteres.'; } else { try { $pdo->beginTransaction(); $slug = slugfy($empresa_nome) . '-' . substr(uniqid(), -4); $pStmt = $pdo->prepare("INSERT INTO empresas (plano_id, nome, slug, telefone, email, aprovado, payment_gateway" . ($payment_gateway === 'manual' ? ', payment_grace_start' : '') . ") VALUES (?,?,?,?,?,0,?" . ($payment_gateway === 'manual' ? ',NOW()' : '') . ")"); $pStmt->execute([$plano_id ?: null, $empresa_nome, $slug, $telefone, $email, $payment_gateway]); $empresaId = $pdo->lastInsertId(); $pdo->prepare("INSERT INTO configuracoes (empresa_id) VALUES (?)")->execute([$empresaId]); $senhaHash = password_hash($senha, PASSWORD_DEFAULT); $hashLink = gerarHash(16); $stmt = $pdo->prepare("INSERT INTO usuarios (empresa_id, nome, email, telefone, senha, tipo, hash_link, aprovado) VALUES (?,?,?,?,?,'admin',?,1)"); $stmt->execute([$empresaId, $nome, $email, $telefone, $senhaHash, $hashLink]); $usuarioId = $pdo->lastInsertId(); $grupoAdmin = $pdo->prepare("SELECT id FROM grupos WHERE empresa_id = ? AND nome = 'Administrador'"); $grupoAdmin->execute([$empresaId]); $gAdmin = $grupoAdmin->fetch(); if (!$gAdmin) { $pdo->prepare("INSERT INTO grupos (empresa_id, nome, descricao, permissoes) VALUES (?,'Administrador','Acesso total','[\"admin\",\"dashboard\",\"usuarios\",\"grupos\",\"profissionais\",\"servicos\",\"clientes\",\"agendamentos\",\"calendario\",\"relatorios\",\"configuracoes\",\"campanhas\",\"bloqueio_dias\",\"financeiro\"]')")->execute([$empresaId]); $pdo->prepare("INSERT INTO grupos (empresa_id, nome, descricao, permissoes) VALUES (?,'Profissional','Acesso a agenda','[\"dashboard\",\"meus_agendamentos\",\"meu_calendario\"]')")->execute([$empresaId]); } $pdo->prepare("UPDATE usuarios SET grupo_id = (SELECT id FROM grupos WHERE empresa_id = ? AND nome = 'Administrador' LIMIT 1) WHERE id = ?") ->execute([$empresaId, $usuarioId]); $pdo->commit(); if ($plano_id > 0) { $plano = $pdo->prepare("SELECT * FROM planos WHERE id = ?"); $plano->execute([$plano_id]); $planoData = $plano->fetch(); if ($planoData && $planoData['valor'] > 0) { $success = 'Conta criada! Aguarde aprovacao do administrador. Plano: ' . sanitize($planoData['nome']) . ' - R$ ' . number_format($planoData['valor'], 2, ',', '.'); } else { $pdo->prepare("UPDATE empresas SET aprovado = 1 WHERE id = ?")->execute([$empresaId]); $success = 'Conta criada com sucesso! Faca o login.'; } } else { $pdo->prepare("UPDATE empresas SET aprovado = 1 WHERE id = ?")->execute([$empresaId]); $success = 'Conta criada com sucesso! Faca o login.'; } } catch (Exception $e) { $pdo->rollBack(); $error = 'Erro ao cadastrar: ' . $e->getMessage(); } } } ?> <!DOCTYPE html> <html lang="pt-BR" data-bs-theme="dark"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Cadastro — Barbearia Prime</title> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css"> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.min.css"> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/animate.css@4.1.1/animate.min.css"> <link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800;900&display=swap" rel="stylesheet"> <style> * { font-family: 'Inter', sans-serif; } body { background:#0b0b1a; min-height:100vh; display:flex; align-items:center; justify-content:center; position:relative; overflow:auto; padding:2rem 0; } body::before { content:''; position:fixed; top:-50%; left:-50%; width:200%; height:200%; background:radial-gradient(ellipse at 20% 50%, rgba(102,126,234,0.12) 0%, transparent 50%), radial-gradient(ellipse at 80% 20%, rgba(118,75,162,0.12) 0%, transparent 50%), radial-gradient(ellipse at 50% 80%, rgba(245,158,11,0.08) 0%, transparent 50%); animation:bgFloat 20s ease-in-out infinite; z-index:0; } @keyframes bgFloat { 0%,100% { transform:translate(0,0); } 25% { transform:translate(-3%,-2%); } 50% { transform:translate(2%,-3%); } 75% { transform:translate(-2%,2%); } } .register-container { width:560px; position:relative; z-index:1; animation:fadeInUp 0.8s ease; } @keyframes fadeInUp { from { opacity:0; transform:translateY(40px); } to { opacity:1; transform:translateY(0); } } .register-card { background:rgba(18,18,42,0.6); backdrop-filter:blur(24px); border:1px solid rgba(255,255,255,0.08); border-radius:24px; box-shadow:0 20px 60px rgba(0,0,0,0.5); padding:2.5rem; } .register-logo { text-align:center; margin-bottom:2rem; } .register-logo .icon { width:64px; height:64px; background:linear-gradient(135deg,rgba(102,126,234,0.2),rgba(118,75,162,0.2)); border-radius:18px; display:flex; align-items:center; justify-content:center; margin:0 auto 1rem; font-size:2rem; color:#00d4ff; filter:drop-shadow(0 0 15px rgba(0,212,255,0.3)); } .register-logo h1 { font-weight:800; background:linear-gradient(135deg,#667eea,#764ba2); -webkit-background-clip:text; -webkit-text-fill-color:transparent; background-clip:text; } .form-control, .form-select { background:rgba(255,255,255,0.04)!important; border:1px solid rgba(255,255,255,0.1)!important; color:#fff!important; border-radius:12px!important; padding:0.75rem 1rem!important; transition:all 0.3s; } .form-control:focus, .form-select:focus { border-color:#667eea!important; box-shadow:0 0 0 3px rgba(102,126,234,0.15)!important; } .form-control::placeholder { color:rgba(255,255,255,0.25); } .input-group-text { background:rgba(255,255,255,0.04)!important; border:1px solid rgba(255,255,255,0.1)!important; color:rgba(255,255,255,0.35)!important; border-radius:12px!important; } .btn-register { background:linear-gradient(135deg,#667eea 0%,#764ba2 100%); border:none; border-radius:12px; padding:0.85rem; font-weight:600; color:#fff; width:100%; box-shadow:0 4px 20px rgba(102,126,234,0.4); transition:all 0.3s; cursor:pointer; } .btn-register:hover { transform:translateY(-2px); box-shadow:0 8px 30px rgba(102,126,234,0.5); } .alert { border-radius:12px; padding:0.75rem 1rem; margin-bottom:1.5rem; font-size:0.9rem; } .alert-danger { background:rgba(239,68,68,0.15); border:1px solid rgba(239,68,68,0.2); color:#fca5a5; } .alert-success { background:rgba(16,185,129,0.15); border:1px solid rgba(16,185,129,0.2); color:#6ee7b7; } .text-muted { color:rgba(255,255,255,0.3)!important; } .plano-card { background:rgba(255,255,255,0.03); border:1px solid rgba(255,255,255,0.06); border-radius:16px; padding:1.25rem; text-align:center; cursor:pointer; transition:all 0.3s; } .plano-card:hover { border-color:rgba(102,126,234,0.3); transform:translateY(-2px); } .plano-card.selected { border-color:#667eea; box-shadow:0 0 20px rgba(102,126,234,0.2); } .plano-card .preco { font-size:1.5rem; font-weight:800; background:linear-gradient(135deg,#667eea,#764ba2); -webkit-background-clip:text; -webkit-text-fill-color:transparent; background-clip:text; } .orb { position:fixed; border-radius:50%; filter:blur(80px); pointer-events:none; z-index:0; animation:orbPulse 6s ease-in-out infinite; } @keyframes orbPulse { 0%,100% { opacity:0.3; transform:scale(1); } 50% { opacity:0.6; transform:scale(1.1); } } </style> </head> <body> <div class="orb" style="width:400px;height:400px;background:rgba(102,126,234,0.12);top:-10%;right:-10%"></div> <div class="orb" style="width:300px;height:300px;background:rgba(118,75,162,0.12);bottom:-5%;left:-5%;animation-delay:-2s"></div> <div class="register-container"> <div class="register-card"> <div class="register-logo"> <div class="icon"><i class="bi bi-scissors"></i></div> <h1>Criar Nova Conta</h1> <p style="color:rgba(255,255,255,0.4);font-size:0.9rem">Cadastre sua empresa e comece a agendar</p> </div> <?php if ($error): ?><div class="alert-danger"><i class="bi bi-exclamation-triangle me-2"></i><?= sanitize($error) ?></div><?php endif; ?> <?php if ($success): ?><div class="alert-success"><i class="bi bi-check-circle me-2"></i><?= sanitize($success) ?></div><?php endif; ?> <form method="POST" action=""> <h6 class="fw-semibold mb-3 text-info"><i class="bi bi-building me-1"></i>Dados da Empresa</h6> <div class="mb-3"> <div class="input-group"><span class="input-group-text"><i class="bi bi-shop"></i></span> <input type="text" name="empresa_nome" class="form-control" placeholder="Nome da barbearia / empresa" required value="<?= sanitize($_POST['empresa_nome'] ?? '') ?>"> </div> </div> <h6 class="fw-semibold mb-3 mt-4 text-info"><i class="bi bi-credit-card me-1"></i>Escolha seu Plano</h6> <div class="row g-3 mb-4" id="planosContainer"> <?php foreach ($planos as $p): ?> <div class="col-md-6"> <div class="plano-card" data-plano-id="<?= $p['id'] ?>" data-valor="<?= $p['valor'] ?>" data-hubpay="<?= $p['gateway_hubpay'] ?>" data-mercadopago="<?= $p['gateway_mercadopago'] ?>" data-asaas="<?= $p['gateway_asaas'] ?>" data-manual="<?= $p['gateway_manual'] ?>"> <h6 class="fw-bold"><?= sanitize($p['nome']) ?></h6> <div class="preco"><?= $p['valor'] > 0 ? 'R$ ' . number_format($p['valor'], 2, ',', '.') : 'Gratis' ?></div> <small class="text-secondary"><?= ucfirst($p['recorencia']) ?></small> <div class="mt-2"><small class="text-secondary"><?= $p['limite_profissionais'] ?> profissionais</small></div> </div> </div> <?php endforeach; ?> </div> <input type="hidden" name="plano_id" id="planoId" value="0"> <div id="gatewaySection" style="display:none" class="mb-4"> <h6 class="fw-semibold mb-3 text-info"><i class="bi bi-credit-card-2-front me-1"></i>Meio de Pagamento</h6> <div id="gatewayOptions" class="row g-2"></div> <input type="hidden" name="payment_gateway" id="paymentGateway" value=""> <small class="text-secondary">Escolha o metodo de pagamento do plano. "Manual" requer aprovacao do suporte.</small> </div> <h6 class="fw-semibold mb-3 text-info"><i class="bi bi-person me-1"></i>Dados do Administrador</h6> <div class="mb-3"> <div class="input-group"><span class="input-group-text"><i class="bi bi-person"></i></span> <input type="text" name="nome" class="form-control" placeholder="Seu nome completo" required value="<?= sanitize($_POST['nome'] ?? '') ?>"> </div> </div> <div class="mb-3"> <div class="input-group"><span class="input-group-text"><i class="bi bi-envelope"></i></span> <input type="email" name="email" class="form-control" placeholder="Seu email" required value="<?= sanitize($_POST['email'] ?? '') ?>"> </div> </div> <div class="mb-3"> <div class="input-group"><span class="input-group-text"><i class="bi bi-telephone"></i></span> <input type="text" name="telefone" class="form-control mask-telefone" placeholder="(11) 99999-9999" value="<?= sanitize($_POST['telefone'] ?? '') ?>"> </div> </div> <div class="row g-3 mb-4"> <div class="col-md-6"> <div class="input-group"><span class="input-group-text"><i class="bi bi-lock"></i></span> <input type="password" name="senha" class="form-control" placeholder="Senha (min. 6)" required> <button class="input-group-text" type="button" onclick="toggleSenha(this)" style="cursor:pointer"><i class="bi bi-eye"></i></button> </div> </div> <div class="col-md-6"> <div class="input-group"><span class="input-group-text"><i class="bi bi-lock-fill"></i></span> <input type="password" name="confirmar_senha" class="form-control" placeholder="Confirmar senha" required> <button class="input-group-text" type="button" onclick="toggleSenha(this)" style="cursor:pointer"><i class="bi bi-eye"></i></button> </div> </div> </div> <button type="submit" class="btn-register"><i class="bi bi-rocket-takeoff me-2"></i>Criar Conta</button> </form> <div class="text-center mt-4"> <a href="<?= URL_BASE ?>login.php" class="text-muted" style="text-decoration:none;font-size:0.9rem"><i class="bi bi-box-arrow-in-right me-1"></i>Ja tem conta? Entrar</a> </div> </div> </div> <script> var gatewaysDisponiveis = <?= json_encode(array_map(function($p) { $gws = []; if ($p['gateway_hubpay']) $gws[] = 'hubpay'; if ($p['gateway_mercadopago']) $gws[] = 'mercadopago'; if ($p['gateway_asaas']) $gws[] = 'asaas'; if ($p['gateway_manual']) $gws[] = 'manual'; return ['id' => $p['id'], 'gateways' => $gws]; }, $planos)) ?>; var gatewayNomes = <?= json_encode($gatewayNomes) ?>; document.querySelectorAll('.plano-card').forEach(function(c) { c.addEventListener('click', function() { document.querySelectorAll('.plano-card').forEach(function(x) { x.classList.remove('selected'); }); this.classList.add('selected'); var planoId = parseInt(this.dataset.planoId); document.getElementById('planoId').value = planoId; // Show gateways for this plan var gwSection = document.getElementById('gatewaySection'); var gwOptions = document.getElementById('gatewayOptions'); var gwInput = document.getElementById('paymentGateway'); gwOptions.innerHTML = ''; gwInput.value = ''; var found = gatewaysDisponiveis.find(function(g) { return g.id === planoId; }); if (found && found.gateways.length > 0) { gwSection.style.display = ''; found.gateways.forEach(function(g) { var col = document.createElement('div'); col.className = 'col-6'; col.innerHTML = '<div class="gateway-option p-3 rounded" style="background:rgba(255,255,255,0.03);border:1px solid rgba(255,255,255,0.06);cursor:pointer;text-align:center;transition:all 0.2s" data-gw="' + g + '" onclick="selecionarGateway(this)"><div class="fw-semibold small">' + (gatewayNomes[g] || g) + '</div></div>'; gwOptions.appendChild(col); }); } else { gwSection.style.display = 'none'; } }); }); function selecionarGateway(el) { document.querySelectorAll('.gateway-option').forEach(function(x) { x.style.borderColor = 'rgba(255,255,255,0.06)'; x.style.background = 'rgba(255,255,255,0.03)'; }); el.style.borderColor = '#667eea'; el.style.background = 'rgba(102,126,234,0.1)'; document.getElementById('paymentGateway').value = el.dataset.gw; } document.querySelectorAll('.mask-telefone').forEach(function(el) { el.addEventListener('input', function(e) { var v = e.target.value.replace(/\D/g, ''); if (v.length <= 10) v = v.replace(/^(\d{2})(\d{4})(\d{0,4})/, '($1) $2-$3'); else v = v.replace(/^(\d{2})(\d{5})(\d{0,4})/, '($1) $2-$3'); e.target.value = v; }); }); function toggleSenha(btn) { var input = btn.closest('.input-group').querySelector('input'); if (!input) return; if (input.type === 'password') { input.type = 'text'; btn.innerHTML = '<i class="bi bi-eye-slash"></i>'; } else { input.type = 'password'; btn.innerHTML = '<i class="bi bi-eye"></i>'; } } </script> </body> </html>
Simpan