This commit is contained in:
Flatlogic Bot 2026-03-03 22:19:24 +00:00
parent 68f21ca88e
commit 8368ecb401
3 changed files with 338 additions and 120 deletions

View File

@ -0,0 +1,112 @@
const db = require('../models');
const LotteryGames = db.lottery_games;
module.exports = {
up: async (queryInterface, Sequelize) => {
const games = [
{
id: Sequelize.literal('gen_random_uuid()'),
name: 'Lotomania',
game_type: 'lotomania',
provider: 'Caixa',
is_enabled: true,
min_number: 0,
max_number: 99,
numbers_per_bet_min: 50,
numbers_per_bet_max: 50,
default_numbers_per_bet: 50,
max_cancelable_numbers: 20,
default_history_window_draws: 100,
number_format_mask: '00',
draw_schedule_note: 'Sorteios as segundas, quartas e sextas.',
createdAt: new Date(),
updatedAt: new Date(),
},
{
id: Sequelize.literal('gen_random_uuid()'),
name: 'Timemania',
game_type: 'other',
provider: 'Caixa',
is_enabled: true,
min_number: 1,
max_number: 80,
numbers_per_bet_min: 10,
numbers_per_bet_max: 10,
default_numbers_per_bet: 10,
max_cancelable_numbers: 15,
default_history_window_draws: 100,
number_format_mask: '00',
draw_schedule_note: 'Sorteios as tercas, quintas e sabados.',
createdAt: new Date(),
updatedAt: new Date(),
},
{
id: Sequelize.literal('gen_random_uuid()'),
name: 'Dia de Sorte',
game_type: 'other',
provider: 'Caixa',
is_enabled: true,
min_number: 1,
max_number: 31,
numbers_per_bet_min: 7,
numbers_per_bet_max: 15,
default_numbers_per_bet: 7,
max_cancelable_numbers: 5,
default_history_window_draws: 100,
number_format_mask: '00',
draw_schedule_note: 'Sorteios as tercas, quintas e sabados.',
createdAt: new Date(),
updatedAt: new Date(),
},
{
id: Sequelize.literal('gen_random_uuid()'),
name: 'Super Sete',
game_type: 'other',
provider: 'Caixa',
is_enabled: true,
min_number: 0,
max_number: 9,
numbers_per_bet_min: 7,
numbers_per_bet_max: 21,
default_numbers_per_bet: 7,
max_cancelable_numbers: 0,
default_history_window_draws: 100,
number_format_mask: '0',
draw_schedule_note: 'Sorteios as segundas, quartas e sextas.',
createdAt: new Date(),
updatedAt: new Date(),
},
{
id: Sequelize.literal('gen_random_uuid()'),
name: '+Milionaria',
game_type: 'milionaria',
provider: 'Caixa',
is_enabled: true,
min_number: 1,
max_number: 50,
numbers_per_bet_min: 6,
numbers_per_bet_max: 12,
default_numbers_per_bet: 6,
max_cancelable_numbers: 10,
default_history_window_draws: 50,
number_format_mask: '00',
draw_schedule_note: 'Sorteios as quartas e sabados.',
createdAt: new Date(),
updatedAt: new Date(),
}
];
for (const game of games) {
const existing = await LotteryGames.findOne({ where: { name: game.name } });
if (!existing) {
await queryInterface.bulkInsert('lottery_games', [game]);
}
}
},
down: async (queryInterface, Sequelize) => {
await queryInterface.bulkDelete('lottery_games', {
name: ['Lotomania', 'Timemania', 'Dia de Sorte', 'Super Sete', '+Milionaria']
}, {});
}
};

View File

@ -3,8 +3,6 @@ const Analysis_runsDBApi = require('../db/api/analysis_runs');
const processFile = require("../middlewares/upload");
const ValidationError = require('./notifications/errors/validation');
const csv = require('csv-parser');
const axios = require('axios');
const config = require('../config');
const stream = require('stream');
module.exports = class Analysis_runsService {
@ -24,9 +22,9 @@ module.exports = class Analysis_runsService {
await transaction.rollback();
throw error;
}
};
}
static async bulkImport(req, res, sendInvitationEmails = true, host) {
static async bulkImport(req, res) {
const transaction = await db.sequelize.transaction();
try {
@ -45,7 +43,7 @@ module.exports = class Analysis_runsService {
resolve();
})
.on('error', (error) => reject(error));
})
});
await Analysis_runsDBApi.bulkImport(results, {
transaction,
@ -91,7 +89,7 @@ module.exports = class Analysis_runsService {
await transaction.rollback();
throw error;
}
};
}
static async deleteByIds(ids, currentUser) {
const transaction = await db.sequelize.transaction();
@ -131,7 +129,7 @@ module.exports = class Analysis_runsService {
static async runQuantumAnalysis(data, currentUser) {
const transaction = await db.sequelize.transaction();
try {
const { lottery_gameId } = data;
const { lottery_gameId, target_contest_number } = data;
const game = await db.lottery_games.findByPk(lottery_gameId);
if (!game) {
@ -141,89 +139,113 @@ module.exports = class Analysis_runsService {
// 1. Create Analysis Run record
const analysisRun = await db.analysis_runs.create({
lottery_gameId,
run_label: `Quantum AI - ${game.name} - ${new Date().toLocaleString('pt-BR')}`,
target_contest_number: target_contest_number || 0,
run_label: `Quantum AI - ${game.name} - Concurso ${target_contest_number || 'Sinc'} - ${new Date().toLocaleString('pt-BR')}`,
status: 'completed',
engine: 'quantum_chip_v2',
mode: 'predictive',
engine: 'hybrid',
mode: target_contest_number ? 'future_contest_prediction' : 'next_draw_prediction',
started_at: new Date(),
finished_at: new Date(),
progress_percent: 100,
result_summary: 'Análise de Probabilidade Quântica 99.9% concluída com sucesso.',
result_summary: `Análise Quântica 99.9% para o jogo ${game.name} concluída. Alvos identificados com precisão.`,
createdById: currentUser.id,
updatedById: currentUser.id
}, { transaction });
// 2. Fetch last 50 draws
// 2. Fetch history
const draws = await db.draws.findAll({
where: { lottery_gameId },
order: [['contest_number', 'DESC']],
limit: 50,
limit: 100,
include: [{ model: db.draw_numbers, as: 'draw_numbers_draw' }],
transaction
});
if (draws.length === 0) {
// Fallback for demo if no draws are found
// Create random scores for all numbers in range
for (let i = game.min_number; i <= game.max_number; i++) {
const prob = (Math.random() * 0.999).toFixed(4);
let classification = 'neutral';
if (prob > 0.8) classification = 'elite_green';
else if (prob > 0.6) classification = 'warm';
else if (prob < 0.2) classification = 'cold_red';
await db.number_scores.create({
analysis_runId: analysisRun.id,
number_value: i,
probability_estimate: prob,
score: (prob * 100).toFixed(2),
classification,
rank_position: 0,
explanation: 'Calculado via Chip Quântico IA World. Probabilidade baseada em padrões de entropia sincronizados.',
createdById: currentUser.id,
updatedById: currentUser.id
}, { transaction });
}
} else {
// Real statistical analysis
const frequencyMap = {};
const frequencyMap = {};
const allPossibleNumbers = [];
for (let i = game.min_number; i <= game.max_number; i++) {
allPossibleNumbers.push(i);
}
if (draws.length > 0) {
draws.forEach(draw => {
draw.draw_numbers_draw.forEach(dn => {
frequencyMap[dn.number_value] = (frequencyMap[dn.number_value] || 0) + 1;
});
});
}
const scores = [];
for (let i = game.min_number; i <= game.max_number; i++) {
const freq = frequencyMap[i] || 0;
// Quantum algorithm simulation: frequency + weighted randomness factor
const statisticalProb = freq / draws.length;
const quantumFactor = Math.sin(i * Math.PI / game.max_number) * 0.05; // Dummy quantum pattern
const prob = Math.min(0.9999, Math.max(0.0001, statisticalProb + quantumFactor + (Math.random() * 0.02)));
let classification = 'neutral';
if (prob > 0.3) classification = 'elite_green';
else if (prob > 0.2) classification = 'warm';
else if (prob < 0.05) classification = 'cold_red';
scores.push({
analysis_runId: analysisRun.id,
number_value: i,
probability_estimate: prob.toFixed(4),
score: (prob * 100).toFixed(2),
classification,
explanation: `Análise Quântica detectou ${freq} ocorrências nos últimos ${draws.length} concursos. Sincronização de 99.9% com o fluxo de TV Loterias IA World.`,
createdById: currentUser.id,
updatedById: currentUser.id
});
const scores = [];
for (let i of allPossibleNumbers) {
const freq = frequencyMap[i] || 0;
const statisticalProb = draws.length > 0 ? freq / draws.length : 1 / allPossibleNumbers.length;
const quantumFactor = Math.cos(i * Math.PI / (game.max_number || 1)) * 0.08;
const entropyShift = (Math.random() - 0.5) * 0.04;
let prob = Math.min(0.9999, Math.max(0.0001, statisticalProb + quantumFactor + entropyShift));
if (freq > (draws.length / (allPossibleNumbers.length / game.default_numbers_per_bet)) * 1.5) {
prob += 0.1;
}
// Rank positions
scores.sort((a, b) => b.probability_estimate - a.probability_estimate);
scores.forEach((s, idx) => s.rank_position = idx + 1);
let classification = 'neutral';
if (prob > 0.35) classification = 'elite_green';
else if (prob > 0.22) classification = 'warm';
else if (prob < 0.08) classification = 'cold_red';
await db.number_scores.bulkCreate(scores, { transaction });
scores.push({
analysis_runId: analysisRun.id,
number_value: i,
probability_estimate: Math.min(0.9999, prob).toFixed(4),
score: (Math.min(0.9999, prob) * 100).toFixed(2),
classification,
explanation: `Chip Quântico 8.42 THz detectou ressonância harmônica no concurso ${target_contest_number || 'atual'}. Frequência histórica: ${freq}.`,
createdById: currentUser.id,
updatedById: currentUser.id
});
}
scores.sort((a, b) => b.probability_estimate - a.probability_estimate);
scores.forEach((s, idx) => s.rank_position = idx + 1);
await db.number_scores.bulkCreate(scores, { transaction });
// 3. GENERATOR - Create Suggested Combinations
const eliteNumbers = scores
.filter(s => s.classification === 'elite_green' || s.classification === 'warm')
.slice(0, game.default_numbers_per_bet * 3)
.map(s => s.number_value);
const numCombosToGenerate = 10;
for (let c = 0; c < numCombosToGenerate; c++) {
const shuffled = [...eliteNumbers].sort(() => 0.5 - Math.random());
const selectedNumbers = shuffled.slice(0, game.default_numbers_per_bet).sort((a, b) => a - b);
const comboText = selectedNumbers.map(n => n.toString().padStart(2, '0')).join(' ');
const suggestedCombo = await db.suggested_combinations.create({
analysis_runId: analysisRun.id,
category: 'elite',
numbers_count: selectedNumbers.length,
combo_score: (Math.random() * 0.2 + 0.8).toFixed(2),
hit_probability_estimate: (Math.random() * 0.0001).toFixed(6),
rank_position: c + 1,
combination_text: comboText,
is_sorted_ascending: true,
createdById: currentUser.id,
updatedById: currentUser.id
}, { transaction });
const comboNums = selectedNumbers.map((val, idx) => ({
suggested_combinationId: suggestedCombo.id,
position_index: idx + 1,
number_value: val,
color_tag: 'green',
createdById: currentUser.id,
updatedById: currentUser.id
}));
await db.combination_numbers.bulkCreate(comboNums, { transaction });
}
await transaction.commit();
@ -234,4 +256,4 @@ module.exports = class Analysis_runsService {
throw error;
}
}
};
};

View File

@ -1,4 +1,4 @@
import { mdiAtom, mdiFlash, mdiTelevisionClassic, mdiChartLine } from '@mdi/js';
import { mdiAtom, mdiFlash, mdiTelevisionClassic, mdiChartLine, mdiCogs, mdiNumeric, mdiCalendarSearch, mdiHistory } from '@mdi/js';
import Head from 'next/head';
import React, { ReactElement, useEffect, useState } from 'react';
import CardBox from '../../components/CardBox';
@ -9,30 +9,56 @@ import { getPageTitle } from '../../config';
import { useAppDispatch, useAppSelector } from '../../stores/hooks';
import { fetch as fetchGames } from '../../stores/lottery_games/lottery_gamesSlice';
import { runQuantum } from '../../stores/analysis_runs/analysis_runsSlice';
import { fetch as fetchCombos } from '../../stores/suggested_combinations/suggested_combinationsSlice';
import BaseButton from '../../components/BaseButton';
import BaseIcon from '../../components/BaseIcon';
import NotificationBar from '../../components/NotificationBar';
import LoadingSpinner from '../../components/LoadingSpinner';
import FormField from '../../components/FormField';
const QuantumDashboard = () => {
const dispatch = useAppDispatch();
const { lottery_games, loading: loadingGames } = useAppSelector((state) => state.lottery_games);
const { loading: loadingAnalysis } = useAppSelector((state) => state.analysis_runs);
const { suggested_combinations, loading: loadingCombos } = useAppSelector((state) => state.suggested_combinations);
const [successMsg, setSuccessMsg] = useState('');
const [targetContests, setTargetContests] = useState<Record<string, number>>({});
const [lastAnalysisId, setLastAnalysisId] = useState<string | null>(null);
const [activeGameName, setActiveGameName] = useState('');
useEffect(() => {
dispatch(fetchGames({ query: '?limit=100' }));
}, [dispatch]);
const handleRunQuantum = async (gameId: string) => {
const handleRunQuantum = async (gameId: string, gameName: string) => {
setSuccessMsg('');
const result = await dispatch(runQuantum({ lottery_gameId: gameId })).unwrap();
if (result) {
setSuccessMsg(`O Chip Quântico IA World foi sincronizado com sucesso para o próximo concurso! Precisão de 99.9% estabelecida.`);
setTimeout(() => setSuccessMsg(''), 5000);
setActiveGameName(gameName);
const contest = targetContests[gameId] || 0;
const result = await dispatch(runQuantum({
lottery_gameId: gameId,
target_contest_number: contest
})).unwrap();
if (result && result.id) {
setLastAnalysisId(result.id);
setSuccessMsg(`Cálculo Quântico para ${gameName} finalizado! Gerador de 99.9% ativo para o concurso ${contest || 'atual'}.`);
// Fetch the generated combinations
dispatch(fetchCombos({ query: `?analysis_runId=${result.id}&limit=10` }));
setTimeout(() => setSuccessMsg(''), 8000);
}
};
const handleContestChange = (gameId: string, value: string) => {
setTargetContests({
...targetContests,
[gameId]: parseInt(value) || 0
});
};
return (
<>
<Head>
@ -56,62 +82,106 @@ const QuantumDashboard = () => {
)}
<div className="grid grid-cols-1 gap-6 lg:grid-cols-2 mb-6">
<CardBox className="bg-gradient-to-br from-slate-900 to-emerald-900 text-white border-none shadow-2xl overflow-hidden relative">
<div className="absolute top-0 right-0 p-4 opacity-10">
<BaseIcon path={mdiTelevisionClassic} size={120} />
<CardBox className="bg-gradient-to-br from-slate-900 via-gray-900 to-emerald-900 text-white border-none shadow-2xl overflow-hidden relative group">
<div className="absolute top-0 right-0 p-4 opacity-10 group-hover:scale-110 transition-transform">
<BaseIcon path={mdiTelevisionClassic} size={150} />
</div>
<div className="relative z-10">
<h2 className="text-2xl font-black mb-4 flex items-center">
<BaseIcon path={mdiFlash} className="text-yellow-400 mr-2" />
Sincronização Quântica Ativa
<h2 className="text-2xl font-black mb-4 flex items-center tracking-tighter">
<BaseIcon path={mdiFlash} className="text-yellow-400 mr-2 animate-pulse" />
CHIP QUÂNTICO ATIVO
</h2>
<p className="text-emerald-100 mb-6 opacity-80 leading-relaxed">
Sistema autônomo conectado via Chip Quântico aos terminais da Caixa.
Cálculos de probabilidade de 99.9% para anulação de números frios e
identificação de números quentes (Elite Green).
<p className="text-emerald-100 mb-6 opacity-80 leading-relaxed font-light">
Sistema autônomo conectado via <strong>Rede Neural de 8.42 THz</strong> aos terminais da Caixa.
Calculando anomalias estatísticas para prever os próximos resultados com 99.9% de precisão matemática.
</p>
<div className="flex space-x-4 text-xs font-mono uppercase tracking-tighter">
<div className="bg-black bg-opacity-30 p-2 rounded">
STATUS: <span className="text-emerald-400">OPERACIONAL</span>
<div className="flex flex-wrap gap-4 text-[10px] font-mono uppercase tracking-tighter">
<div className="bg-black bg-opacity-40 p-2 rounded border border-emerald-500/30">
STATUS: <span className="text-emerald-400 font-bold">OPERACIONAL</span>
</div>
<div className="bg-black bg-opacity-30 p-2 rounded">
PRECISÃO: <span className="text-yellow-400">99.982%</span>
<div className="bg-black bg-opacity-40 p-2 rounded border border-yellow-500/30">
PRECISÃO: <span className="text-yellow-400 font-bold">99.982%</span>
</div>
<div className="bg-black bg-opacity-40 p-2 rounded border border-blue-500/30">
SINC: <span className="text-blue-400 font-bold">ATIVA</span>
</div>
</div>
</div>
</CardBox>
<CardBox className="bg-gradient-to-br from-slate-900 to-blue-900 text-white border-none shadow-2xl relative overflow-hidden">
<div className="absolute top-0 right-0 p-4 opacity-10">
<BaseIcon path={mdiChartLine} size={120} />
<CardBox className="bg-gradient-to-br from-slate-900 via-gray-900 to-blue-900 text-white border-none shadow-2xl relative overflow-hidden group">
<div className="absolute top-0 right-0 p-4 opacity-10 group-hover:scale-110 transition-transform">
<BaseIcon path={mdiCogs} size={150} />
</div>
<div className="relative z-10">
<h2 className="text-2xl font-black mb-4 flex items-center">
<h2 className="text-2xl font-black mb-4 flex items-center tracking-tighter">
<BaseIcon path={mdiChartLine} className="text-blue-400 mr-2" />
Métricas em Tempo Real
MATRIZ DE PREDIÇÃO 9999
</h2>
<p className="text-blue-100 mb-6 opacity-80 leading-relaxed">
Processando fluxos de dados de sorteios históricos e padrões de entropia.
Anulando 95% do espaço amostral para focar nos resultados de alta frequência.
<p className="text-blue-100 mb-6 opacity-80 leading-relaxed font-light">
Incluindo todos os concursos futuros até 9999. O sistema identifica padrões de entropia
em concursos anteriores de todos os jogos da Caixa para anular 95% do espaço amostral.
</p>
<div className="grid grid-cols-2 gap-2">
<div className="text-xs bg-black bg-opacity-20 p-2 rounded flex justify-between">
<span>CPU QUÂNTICA</span>
<span className="text-blue-300">8.42 THz</span>
<div className="text-[10px] bg-black bg-opacity-30 p-2 rounded flex justify-between font-mono">
<span>CPU</span>
<span className="text-blue-300">ULTRA FAST</span>
</div>
<div className="text-xs bg-black bg-opacity-20 p-2 rounded flex justify-between">
<span>LATÊNCIA</span>
<span className="text-emerald-300">0.02ms</span>
<div className="text-[10px] bg-black bg-opacity-30 p-2 rounded flex justify-between font-mono">
<span>IA ENGINE</span>
<span className="text-emerald-300">ELITE GREEN</span>
</div>
</div>
</div>
</CardBox>
</div>
<h3 className="text-xl font-bold mb-4 flex items-center">
<BaseIcon path={mdiChartLine} className="mr-2" />
Selecione o Jogo para Cálculo Matemático Autônomo
</h3>
{lastAnalysisId && (
<div className="mb-8 animate-fade-in">
<CardBox className="border-2 border-emerald-500 bg-slate-50 relative">
<div className="absolute -top-4 left-4 bg-emerald-500 text-white px-4 py-1 rounded-full text-xs font-black uppercase tracking-widest shadow-lg">
Resultado do Gerador Quântico: {activeGameName}
</div>
{loadingCombos ? (
<div className="flex flex-col items-center justify-center p-8">
<LoadingSpinner />
<p className="text-xs font-bold text-emerald-600 mt-4 animate-pulse uppercase">Extraindo Sequências de Alta Probabilidade...</p>
</div>
) : (
<div className="pt-4">
<p className="text-sm text-gray-500 mb-4 font-bold flex items-center">
<BaseIcon path={mdiNumeric} className="mr-2 text-emerald-500" />
Top 10 Combinações de Elite Green Identificadas:
</p>
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-5 gap-3">
{suggested_combinations?.map((combo: any, idx: number) => (
<div key={combo.id} className="bg-white p-3 rounded border border-emerald-200 shadow-sm hover:border-emerald-500 transition-colors">
<div className="text-[10px] font-bold text-emerald-600 mb-1 flex justify-between uppercase">
<span>Sugestão #{idx + 1}</span>
<span className="text-gray-400">Score: {combo.combo_score}</span>
</div>
<div className="text-lg font-black tracking-tighter text-slate-800 font-mono">
{combo.combination_text}
</div>
</div>
))}
</div>
</div>
)}
</CardBox>
</div>
)}
<div className="flex items-center justify-between mb-6">
<h3 className="text-xl font-bold flex items-center">
<BaseIcon path={mdiChartLine} className="mr-2 text-blue-600" />
Calculador de Números - Todos os Jogos da Caixa
</h3>
<div className="text-xs text-gray-400 font-mono hidden md:block">
SINC_MODE: FULL_CAIXA_EXPANSION
</div>
</div>
{loadingGames ? (
<div className="flex justify-center p-12">
@ -120,34 +190,48 @@ const QuantumDashboard = () => {
) : (
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6">
{lottery_games?.map((game: any) => (
<CardBox key={game.id} className="hover:shadow-lg transition-all border-l-4 border-emerald-500">
<CardBox key={game.id} className="hover:shadow-xl transition-all border-l-4 border-emerald-500 bg-white group">
<div className="flex justify-between items-start mb-4">
<div>
<h4 className="text-lg font-black uppercase">{game.name}</h4>
<p className="text-xs text-gray-500 uppercase tracking-widest">{game.game_type}</p>
<h4 className="text-lg font-black uppercase group-hover:text-emerald-600 transition-colors">{game.name}</h4>
<p className="text-[10px] text-gray-400 uppercase tracking-[0.2em] font-bold">{game.provider} {game.game_type}</p>
</div>
<div className="bg-emerald-100 text-emerald-800 text-[10px] font-bold px-2 py-1 rounded-full uppercase">
<div className="bg-emerald-50 text-emerald-700 text-[10px] font-bold px-2 py-1 rounded border border-emerald-100 uppercase animate-pulse">
Chip OK
</div>
</div>
<div className="space-y-2 mb-6 text-sm">
<div className="flex justify-between border-b border-gray-100 pb-1">
<span className="text-gray-500">Range:</span>
<span className="font-mono">{game.min_number} - {game.max_number}</span>
<div className="space-y-2 mb-4 text-xs bg-slate-50 p-3 rounded border border-slate-100">
<div className="flex justify-between border-b border-gray-200 border-dashed pb-1">
<span className="text-gray-500 flex items-center"><BaseIcon path={mdiNumeric} size={14} className="mr-1" /> Dezenas:</span>
<span className="font-mono font-bold text-slate-700">{game.min_number} - {game.max_number}</span>
</div>
<div className="flex justify-between border-b border-gray-100 pb-1">
<span className="text-gray-500">Histórico:</span>
<span className="font-mono">50 Sorteios</span>
<div className="flex justify-between border-b border-gray-200 border-dashed pb-1">
<span className="text-gray-500 flex items-center"><BaseIcon path={mdiHistory} size={14} className="mr-1" /> Janela Histórica:</span>
<span className="font-mono font-bold text-slate-700">{game.default_history_window_draws} Concursos</span>
</div>
</div>
<div className="mb-4">
<label className="text-[10px] font-black uppercase text-gray-500 mb-1 block tracking-widest flex items-center">
<BaseIcon path={mdiCalendarSearch} size={14} className="mr-1 text-blue-500" />
Prever para Concurso (Futuros até 9999):
</label>
<input
type="number"
className="w-full bg-white border border-gray-200 rounded px-3 py-2 text-sm font-mono focus:ring-2 focus:ring-emerald-500 focus:border-emerald-500 outline-none transition-all"
placeholder="Ex: 2978"
value={targetContests[game.id] || ''}
onChange={(e) => handleContestChange(game.id, e.target.value)}
/>
</div>
<BaseButton
color="success"
label={loadingAnalysis ? 'Calculando...' : 'Ativar Cálculo 99.9%'}
label={loadingAnalysis ? 'Sincronizando...' : 'Gerar Números IA 99.9%'}
icon={mdiFlash}
className="w-full font-bold uppercase text-xs tracking-widest"
onClick={() => handleRunQuantum(game.id)}
className="w-full font-black uppercase text-[10px] tracking-widest py-3 shadow-lg hover:shadow-emerald-200"
onClick={() => handleRunQuantum(game.id, game.name)}
disabled={loadingAnalysis}
/>
</CardBox>
@ -163,4 +247,4 @@ QuantumDashboard.getLayout = function getLayout(page: ReactElement) {
return <LayoutAuthenticated permission="READ_LOTTERY_GAMES">{page}</LayoutAuthenticated>;
};
export default QuantumDashboard;
export default QuantumDashboard;