home
/
u529748449
/
domains
/
borabilhete.com
/
public_html
/
admin
➕ New
📤 Upload
✎ Editing:
meuperfil.php
← Back
<?php // admin/meuperfil.php require_once __DIR__ . '/conexao.php'; require_once __DIR__ . '/auth.php'; error_reporting(E_ALL); ini_set('display_errors', 1); date_default_timezone_set('America/Sao_Paulo'); require_login(['admin','produtor','agente']); if (session_status() !== PHP_SESSION_ACTIVE) { session_start(); } function h($s){ return htmlspecialchars((string)$s, ENT_QUOTES, 'UTF-8'); } function email_exists(mysqli $conn, string $email, int $ignoreId): bool { $st = $conn->prepare("SELECT 1 FROM produtores WHERE email=? AND id<>? LIMIT 1"); $st->bind_param('si', $email, $ignoreId); $st->execute(); $has = (bool)$st->get_result()->fetch_row(); $st->close(); return $has; } $uid = (int)($_SESSION['produtor_id'] ?? $_SESSION['user_id'] ?? 0); $myRole = $_SESSION['role'] ?? ''; $isAdmin = $myRole === 'admin'; $isAgent = $myRole === 'agente'; if ($uid <= 0) { header('Location: login.php'); exit; } // flash $flash = $_SESSION['flash_profile'] ?? []; unset($_SESSION['flash_profile']); function add_flash($t,$m){ $_SESSION['flash_profile'][] = ['t'=>$t,'m'=>$m]; } // CSRF if (empty($_SESSION['csrf_profile'])) { $_SESSION['csrf_profile'] = bin2hex(random_bytes(16)); } $CSRF = $_SESSION['csrf_profile']; // carrega usuário + empresa $st = $conn->prepare("SELECT id, nome, email, role, empresa_id FROM produtores WHERE id=?"); $st->bind_param('i', $uid); $st->execute(); $user = $st->get_result()->fetch_assoc(); $st->close(); if (!$user) { add_flash('error','Usuário não encontrado.'); header('Location: index.php'); exit; } $empresa = null; if (!empty($user['empresa_id'])) { $eid = (int)$user['empresa_id']; $st = $conn->prepare("SELECT * FROM produtoras WHERE id=?"); $st->bind_param('i', $eid); $st->execute(); $empresa = $st->get_result()->fetch_assoc(); $st->close(); } // ===== Helpers upload ===== function salvar_logo_upload(string $input, int $empresaId, ?string $logoAtual): ?string { if (empty($_FILES[$input]) || $_FILES[$input]['error'] !== UPLOAD_ERR_OK) { return $logoAtual; // sem mudança } $allowed = ['image/jpeg'=>'.jpg','image/png'=>'.png','image/webp'=>'.webp']; $mime = mime_content_type($_FILES[$input]['tmp_name']); if (!isset($allowed[$mime])) { throw new RuntimeException('Formato de logo inválido. Use JPG, PNG ou WEBP.'); } if ($_FILES[$input]['size'] > 2*1024*1024) { throw new RuntimeException('Logo muito grande (máx. 2MB).'); } $ext = $allowed[$mime]; $dir = __DIR__ . '/uploads/produtoras'; if (!is_dir($dir)) { @mkdir($dir, 0775, true); } $destFs = $dir . "/logo_{$empresaId}{$ext}"; // se extensão mudou, apaga antigas possíveis foreach (['.jpg','.png','.webp'] as $e) { $old = $dir . "/logo_{$empresaId}{$e}"; if (file_exists($old) && $old !== $destFs) @unlink($old); } if (!move_uploaded_file($_FILES[$input]['tmp_name'], $destFs)) { throw new RuntimeException('Falha ao salvar o arquivo de logo.'); } // caminho relativo usado no site return "uploads/produtoras/logo_{$empresaId}{$ext}"; } // ===== POST ===== if ($_SERVER['REQUEST_METHOD']==='POST') { $okCsrf = isset($_POST['csrf']) && hash_equals($_SESSION['csrf_profile'], (string)$_POST['csrf']); if (!$okCsrf) { add_flash('error','Falha de CSRF. Recarregue a página.'); header('Location: meuperfil.php'); exit; } $action = $_POST['action'] ?? ''; // 1) atualizar dados pessoais if ($action === 'update_user') { $nome = trim($_POST['nome'] ?? ''); $email = trim($_POST['email'] ?? ''); $senha = (string)($_POST['senha'] ?? ''); if ($nome==='' || $email==='') { add_flash('error','Preencha nome e e-mail.'); header('Location: meuperfil.php'); exit; } if (!filter_var($email, FILTER_VALIDATE_EMAIL)) { add_flash('error','E-mail inválido.'); header('Location: meuperfil.php'); exit; } if (email_exists($conn, $email, $uid)) { add_flash('error','Já existe usuário com este e-mail.'); header('Location: meuperfil.php'); exit; } if ($senha !== '') { if (strlen($senha) < 6) { add_flash('error','A nova senha deve ter no mínimo 6 caracteres.'); header('Location: meuperfil.php'); exit; } $hash = password_hash($senha, PASSWORD_DEFAULT); $st = $conn->prepare("UPDATE produtores SET nome=?, email=?, senha=? WHERE id=?"); $st->bind_param('sssi', $nome, $email, $hash, $uid); } else { $st = $conn->prepare("UPDATE produtores SET nome=?, email=? WHERE id=?"); $st->bind_param('ssi', $nome, $email, $uid); } $ok = $st->execute(); $st->close(); if ($ok) { $_SESSION['nome'] = $nome; add_flash('ok','Seus dados foram atualizados.'); } else { add_flash('error','Erro ao atualizar seus dados: '.$conn->error); } header('Location: meuperfil.php'); exit; } // 2) criar/atualizar produtora (agente NÃO pode) if ($action === 'save_empresa') { if ($isAgent) { add_flash('error','Agentes não podem editar os dados da produtora.'); header('Location: meuperfil.php'); exit; } $nome_fantasia = trim($_POST['nome_fantasia'] ?? ''); if ($nome_fantasia==='') { add_flash('error','Informe o nome fantasia da produtora.'); header('Location: meuperfil.php'); exit; } $razao = trim($_POST['razao_social'] ?? ''); $cnpj = trim($_POST['cnpj'] ?? ''); $emailEmp = trim($_POST['email_empresa'] ?? ''); $tel = trim($_POST['telefone'] ?? ''); $endereco = trim($_POST['endereco'] ?? ''); $cidade = trim($_POST['cidade'] ?? ''); $uf = strtoupper(trim($_POST['uf'] ?? '')); $cep = trim($_POST['cep'] ?? ''); $site = trim($_POST['site'] ?? ''); $insta = trim($_POST['instagram'] ?? ''); $pix = trim($_POST['pix_chave'] ?? ''); try { if ($empresa) { // update $st = $conn->prepare(" UPDATE produtoras SET nome_fantasia=?, razao_social=?, cnpj=?, email=?, telefone=?, endereco=?, cidade=?, uf=?, cep=?, site=?, instagram=?, pix_chave=?, atualizado_em=NOW() WHERE id=? "); $st->bind_param('ssssssssssssi', $nome_fantasia, $razao, $cnpj, $emailEmp, $tel, $endereco, $cidade, $uf, $cep, $site, $insta, $pix, $empresa['id'] ); $ok = $st->execute(); $st->close(); // upload de logo (opcional) if ($ok) { $novoLogo = salvar_logo_upload('logo', (int)$empresa['id'], $empresa['logo'] ?? null); if ($novoLogo !== ($empresa['logo'] ?? null)) { $st2 = $conn->prepare("UPDATE produtoras SET logo=?, atualizado_em=NOW() WHERE id=?"); $st2->bind_param('si', $novoLogo, $empresa['id']); $st2->execute(); $st2->close(); $empresa['logo'] = $novoLogo; } } add_flash($ok?'ok':'error', $ok?'Dados da produtora atualizados.':'Erro ao atualizar a produtora: '.$conn->error); } else { // insert e vincula ao usuário $st = $conn->prepare(" INSERT INTO produtoras (nome_fantasia, razao_social, cnpj, email, telefone, endereco, cidade, uf, cep, site, instagram, pix_chave, criado_em) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,NOW()) "); $st->bind_param('ssssssssssss', $nome_fantasia, $razao, $cnpj, $emailEmp, $tel, $endereco, $cidade, $uf, $cep, $site, $insta, $pix ); $okIns = $st->execute(); $eid = $st->insert_id; $st->close(); if ($okIns && $eid>0) { // upload de logo (opcional) $novoLogo = null; try { $novoLogo = salvar_logo_upload('logo', (int)$eid, null); } catch(Throwable $e) { /* se não enviou, ignora */ } if ($novoLogo) { $stL = $conn->prepare("UPDATE produtoras SET logo=? WHERE id=?"); $stL->bind_param('si', $novoLogo, $eid); $stL->execute(); $stL->close(); } $st2 = $conn->prepare("UPDATE produtores SET empresa_id=? WHERE id=?"); $st2->bind_param('ii', $eid, $uid); $ok2 = $st2->execute(); $st2->close(); if ($ok2) add_flash('ok','Produtora criada e vinculada ao seu perfil.'); else add_flash('error','Produtora criada, mas falhou vincular ao usuário: '.$conn->error); } else { add_flash('error','Erro ao criar produtora: '.$conn->error); } } } catch (Throwable $e) { add_flash('error', $e->getMessage()); } header('Location: meuperfil.php'); exit; } // 3) vincular a produtora EXISTENTE (agente pode) if ($action === 'vincular_empresa') { $empresaSel = isset($_POST['empresa_id_escolhida']) && ctype_digit($_POST['empresa_id_escolhida']) ? (int)$_POST['empresa_id_escolhida'] : 0; if ($empresaSel <= 0) { add_flash('error','Selecione uma produtora válida.'); header('Location: meuperfil.php'); exit; } // verifica se existe $st = $conn->prepare("SELECT id FROM produtoras WHERE id=?"); $st->bind_param('i', $empresaSel); $st->execute(); $ok = (bool)$st->get_result()->fetch_row(); $st->close(); if (!$ok) { add_flash('error','Produtora não encontrada.'); header('Location: meuperfil.php'); exit; } $st = $conn->prepare("UPDATE produtores SET empresa_id=? WHERE id=?"); $st->bind_param('ii', $empresaSel, $uid); $ok2 = $st->execute(); $st->close(); add_flash($ok2?'ok':'error', $ok2?'Vínculo atualizado com sucesso.':'Erro ao atualizar vínculo: '.$conn->error); header('Location: meuperfil.php'); exit; } add_flash('error','Ação inválida.'); header('Location: meuperfil.php'); exit; } ?> <!DOCTYPE html> <html lang="pt-BR"> <head> <meta charset="UTF-8"> <title>Meu perfil</title> <meta name="viewport" content="width=device-width, initial-scale=1" /> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.0/css/all.min.css"> <link rel="stylesheet" href="css/adminprodutor.css?v=2"> <link rel="stylesheet" href="../public/css/header.css"> <style> .form-grid { display:grid; grid-template-columns: 1fr 1fr; gap:12px; } @media (max-width: 800px){ .form-grid { grid-template-columns: 1fr; } } .field { display:flex; flex-direction:column; gap:6px; } .card h3 { margin-top:0; } .muted { color:#6b7280; } .logo-preview { max-height:72px; border-radius:10px; display:block; margin-top:6px; } .hint { font-size:12px; color:#6b7280; } </style> </head> <body> <?php include __DIR__ . '/includes/header_admin.php'; ?> <div class="container"> <h1><i class="fa-solid fa-id-badge"></i> Meu perfil</h1> <?php foreach($flash as $f): ?> <div class="alert <?= $f['t']==='ok'?'ok':'error' ?>"><?= h($f['m']) ?></div> <?php endforeach; ?> <div class="grid-2-time" style="grid-template-columns: 1fr 1.3fr; gap:16px;"> <!-- Dados pessoais --> <div class="card"> <h3><i class="fa-solid fa-user"></i> Meus dados</h3> <form method="post"> <input type="hidden" name="csrf" value="<?= h($CSRF) ?>"> <input type="hidden" name="action" value="update_user"> <div class="form-grid"> <div class="field"> <label>Nome</label> <input type="text" name="nome" value="<?= h($user['nome']) ?>" required> </div> <div class="field"> <label>E-mail</label> <input type="email" name="email" value="<?= h($user['email']) ?>" required> </div> <div class="field"> <label>Nova senha (opcional)</label> <input type="password" name="senha" minlength="6" placeholder="Deixe em branco para manter"> </div> <div class="field"> <label>Papel</label> <input type="text" value="<?= h(ucfirst($user['role'])) ?>" disabled> </div> </div> <button class="submit" type="submit"><i class="fa-solid fa-floppy-disk"></i> Salvar meus dados</button> </form> <!-- Vínculo a produtora existente (todos podem; útil para AGENTE) --> <hr style="margin:16px 0;border:none;border-top:1px solid #eee"> <h3><i class="fa-solid fa-link"></i> Vincular a uma produtora existente</h3> <form method="post" id="form-vinculo"> <input type="hidden" name="csrf" value="<?= h($CSRF) ?>"> <input type="hidden" name="action" value="vincular_empresa"> <input type="hidden" name="empresa_id_escolhida" id="empresa_id_escolhida"> <div class="field"> <label>Buscar produtora (nome/CNPJ)</label> <input type="text" id="busca_produtora" placeholder="Digite 2+ letras..." list="listaProdutoras" autocomplete="off"> <datalist id="listaProdutoras"></datalist> <span class="hint">Comece a digitar para ver sugestões.</span> </div> <button class="btn" type="submit" id="btnVincular" disabled> <i class="fa-solid fa-check"></i> Vincular </button> </form> </div> <!-- Produtora --> <div class="card"> <h3><i class="fa-solid fa-building"></i> Minha produtora</h3> <?php if(!$empresa): ?> <p class="muted">Você ainda não possui uma produtora vinculada. Preencha os dados abaixo para criar e vincular.</p> <?php endif; ?> <form method="post" enctype="multipart/form-data"> <input type="hidden" name="csrf" value="<?= h($CSRF) ?>"> <input type="hidden" name="action" value="save_empresa"> <div class="form-grid"> <div class="field"> <label>Nome fantasia *</label> <input <?= $isAgent?'disabled':'' ?> type="text" name="nome_fantasia" value="<?= h($empresa['nome_fantasia'] ?? '') ?>" required> </div> <div class="field"> <label>Razão social</label> <input <?= $isAgent?'disabled':'' ?> type="text" name="razao_social" value="<?= h($empresa['razao_social'] ?? '') ?>"> </div> <div class="field"> <label>CNPJ</label> <input <?= $isAgent?'disabled':'' ?> type="text" name="cnpj" value="<?= h($empresa['cnpj'] ?? '') ?>"> </div> <div class="field"> <label>E-mail</label> <input <?= $isAgent?'disabled':'' ?> type="email" name="email_empresa" value="<?= h($empresa['email'] ?? '') ?>"> </div> <div class="field"> <label>Telefone</label> <input <?= $isAgent?'disabled':'' ?> type="text" name="telefone" value="<?= h($empresa['telefone'] ?? '') ?>"> </div> <div class="field"> <label>Endereço</label> <input <?= $isAgent?'disabled':'' ?> type="text" name="endereco" value="<?= h($empresa['endereco'] ?? '') ?>"> </div> <div class="field"> <label>Cidade</label> <input <?= $isAgent?'disabled':'' ?> type="text" name="cidade" value="<?= h($empresa['cidade'] ?? '') ?>"> </div> <div class="field"> <label>UF</label> <input <?= $isAgent?'disabled':'' ?> type="text" name="uf" maxlength="2" value="<?= h($empresa['uf'] ?? '') ?>"> </div> <div class="field"> <label>CEP</label> <input <?= $isAgent?'disabled':'' ?> type="text" name="cep" value="<?= h($empresa['cep'] ?? '') ?>"> </div> <div class="field"> <label>Site</label> <input <?= $isAgent?'disabled':'' ?> type="url" name="site" value="<?= h($empresa['site'] ?? '') ?>"> </div> <div class="field"> <label>Instagram</label> <input <?= $isAgent?'disabled':'' ?> type="text" name="instagram" value="<?= h($empresa['instagram'] ?? '') ?>" placeholder="@sua_produtora"> </div> <div class="field"> <label>Chave Pix</label> <input <?= $isAgent?'disabled':'' ?> type="text" name="pix_chave" value="<?= h($empresa['pix_chave'] ?? '') ?>"> </div> <div class="field" style="grid-column: 1 / -1;"> <label>Logo (PNG/JPG/WEBP – até 2MB)</label> <?php if(!empty($empresa['logo'])): ?> <img class="logo-preview" src="<?= h($empresa['logo'][0]=='/' ? ('..'.$empresa['logo']) : ('../admin/'.$empresa['logo'])) ?>" alt="Logo atual"> <?php endif; ?> <input <?= $isAgent?'disabled':'' ?> type="file" name="logo" accept=".png,.jpg,.jpeg,.webp"> </div> </div> <button class="submit" type="submit" <?= $isAgent?'disabled':'' ?>> <i class="fa-solid fa-floppy-disk"></i> <?= $empresa ? 'Salvar produtora' : 'Criar produtora' ?> </button> <?php if($isAgent): ?> <p class="hint" style="margin-top:8px">Agentes só podem visualizar os dados da produtora; para alterar, solicite ao produtor/admin.</p> <?php endif; ?> </form> </div> </div> </div> <script> const mapa = new Map(); const $input = document.getElementById('busca_produtora'); const $list = document.getElementById('listaProdutoras'); const $hidden= document.getElementById('empresa_id_escolhida'); const $btn = document.getElementById('btnVincular'); let lastQ = ''; let debounce; $input.addEventListener('input', () => { const q = $input.value.trim(); $hidden.value = ''; $btn.disabled = true; if (debounce) clearTimeout(debounce); if (q.length < 2) { $list.innerHTML = ''; return; } debounce = setTimeout(() => { if (q === lastQ) return; lastQ = q; fetch('buscar_produtoras.php?q=' + encodeURIComponent(q), {credentials:'same-origin'}) .then(r => r.json()) .then(items => { mapa.clear(); $list.innerHTML = ''; (items || []).forEach(it => { mapa.set(it.text, it.id); const opt = document.createElement('option'); opt.value = it.text; $list.appendChild(opt); }); }) .catch(() => {}); }, 250); }); $input.addEventListener('change', () => { const id = mapa.get($input.value.trim()); if (id) { $hidden.value = String(id); $btn.disabled = false; } else { $hidden.value = ''; $btn.disabled = true; } }); </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