PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::ATTR_EMULATE_PREPARES => false, ] ); } catch (PDOException $e) { http_response_code(500); die(json_encode(['error' => 'DB Error: ' . $e->getMessage()])); } } return $pdo; } function setupDB() { $db = getDB(); $db->exec("CREATE TABLE IF NOT EXISTS daily_records ( id INT AUTO_INCREMENT PRIMARY KEY, record_date DATE NOT NULL UNIQUE, tiktok DECIMAL(10,2) NOT NULL DEFAULT 0.00, google DECIMAL(10,2) NOT NULL DEFAULT 0.00, meta DECIMAL(10,2) NOT NULL DEFAULT 0.00, proxy DECIMAL(10,2) NOT NULL DEFAULT 0.00, outros DECIMAL(10,2) NOT NULL DEFAULT 0.00, receita DECIMAL(10,2) NOT NULL DEFAULT 0.00, rec_contas DECIMAL(10,2) NOT NULL DEFAULT 0.00, rec_curso DECIMAL(10,2) NOT NULL DEFAULT 0.00, rec_afiliado DECIMAL(10,2) NOT NULL DEFAULT 0.00, rec_servicos DECIMAL(10,2) NOT NULL DEFAULT 0.00, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4"); // Migração automática — adiciona colunas novas se ainda não existirem foreach (['rec_contas','rec_curso','rec_afiliado','rec_servicos'] as $col) { try { $db->exec("ALTER TABLE daily_records ADD COLUMN {$col} DECIMAL(10,2) NOT NULL DEFAULT 0.00"); } catch(Exception $e) {} } } setupDB(); // ============================================================ // AUTENTICAÇÃO // ============================================================ $admin_user = 'admin'; $admin_pass = '@Senha24'; if (isset($_POST['action'])) { header('Content-Type: application/json'); $action = $_POST['action']; // LOGIN if ($action === 'login') { $user = $_POST['username'] ?? ''; $pass = $_POST['password'] ?? ''; if ($user === $admin_user && $pass === $admin_pass) { $_SESSION['logged'] = true; echo json_encode(['ok' => true]); } else { echo json_encode(['ok' => false, 'msg' => 'Usuário ou senha inválidos']); } exit; } // LOGOUT if ($action === 'logout') { session_destroy(); echo json_encode(['ok' => true]); exit; } if (!isset($_SESSION['logged'])) { echo json_encode(['error' => 'Não autorizado']); exit; } // SALVAR / ATUALIZAR if ($action === 'save') { try { $db = getDB(); $date = trim($_POST['date'] ?? ''); if (!$date) { echo json_encode(['ok' => false, 'msg' => 'Data inválida']); exit; } $tiktok = floatval($_POST['tiktok'] ?? 0); $google = floatval($_POST['google'] ?? 0); $meta = floatval($_POST['meta'] ?? 0); $proxy = floatval($_POST['proxy'] ?? 0); $outros = floatval($_POST['outros'] ?? 0); $rec_contas = floatval($_POST['rec_contas'] ?? 0); $rec_curso = floatval($_POST['rec_curso'] ?? 0); $rec_afiliado = floatval($_POST['rec_afiliado'] ?? 0); $rec_servicos = floatval($_POST['rec_servicos'] ?? 0); $receita = $rec_contas + $rec_curso + $rec_afiliado + $rec_servicos; $stmt = $db->prepare( "INSERT INTO daily_records (record_date, tiktok, google, meta, proxy, outros, receita, rec_contas, rec_curso, rec_afiliado, rec_servicos) VALUES (:date, :tiktok, :google, :meta, :proxy, :outros, :receita, :rec_contas, :rec_curso, :rec_afiliado, :rec_servicos) ON DUPLICATE KEY UPDATE tiktok=VALUES(tiktok), google=VALUES(google), meta=VALUES(meta), proxy=VALUES(proxy), outros=VALUES(outros), receita=VALUES(receita), rec_contas=VALUES(rec_contas), rec_curso=VALUES(rec_curso), rec_afiliado=VALUES(rec_afiliado), rec_servicos=VALUES(rec_servicos), updated_at=NOW()" ); $stmt->execute([ ':date' => $date, ':tiktok' => $tiktok, ':google' => $google, ':meta' => $meta, ':proxy' => $proxy, ':outros' => $outros, ':receita' => $receita, ':rec_contas' => $rec_contas, ':rec_curso' => $rec_curso, ':rec_afiliado' => $rec_afiliado, ':rec_servicos' => $rec_servicos, ]); echo json_encode(['ok' => true]); } catch (Exception $e) { echo json_encode(['ok' => false, 'msg' => $e->getMessage()]); } exit; } // LISTAR if ($action === 'list') { try { $db = getDB(); $days = intval($_POST['days'] ?? 30); $stmt = $db->prepare("SELECT * FROM daily_records ORDER BY record_date DESC LIMIT :lim"); $stmt->bindValue(':lim', $days, PDO::PARAM_INT); $stmt->execute(); echo json_encode($stmt->fetchAll()); } catch (Exception $e) { echo json_encode(['error' => $e->getMessage()]); } exit; } // BUSCAR POR DATA if ($action === 'get') { try { $db = getDB(); $date = trim($_POST['date'] ?? ''); $stmt = $db->prepare("SELECT * FROM daily_records WHERE record_date = :date"); $stmt->execute([':date' => $date]); echo json_encode($stmt->fetch() ?: null); } catch (Exception $e) { echo json_encode(['error' => $e->getMessage()]); } exit; } // DELETAR if ($action === 'delete') { try { $db = getDB(); $id = intval($_POST['id'] ?? 0); $stmt = $db->prepare("DELETE FROM daily_records WHERE id = :id"); $stmt->execute([':id' => $id]); echo json_encode(['ok' => true]); } catch (Exception $e) { echo json_encode(['ok' => false, 'msg' => $e->getMessage()]); } exit; } // GRÁFICO if ($action === 'chart') { try { $db = getDB(); $days = intval($_POST['days'] ?? 30); $stmt = $db->prepare("SELECT * FROM daily_records ORDER BY record_date ASC LIMIT :lim"); $stmt->bindValue(':lim', $days, PDO::PARAM_INT); $stmt->execute(); echo json_encode($stmt->fetchAll()); } catch (Exception $e) { echo json_encode(['error' => $e->getMessage()]); } exit; } echo json_encode(['error' => 'Ação inválida']); exit; } $isLogged = isset($_SESSION['logged']); ?>
| Data | Gastos | Contas | Curso | Afiliado | Serviços | Receita | Lucro |
|---|