// actionPlanManager.js // Gerenciador de Planos de Ação (function(window) { 'use strict'; // Elementos específicos para planos de ação let newActionPlanBtn; let cancelActionPlanBtn; let startActionPlanBtn; let actionPlanForm; let actionPlanTitleInput; let availableTranscriptions; let availableAnalyses; let selectedDocumentsList; let actionPlansList; let actionPlanTitleDisplay; let actionPlanDate; let actionPlanDocumentsCount; let actionPlanText; let exportActionPlanPdfBtn; let copyActionPlanBtn; let backToClientFromPlanBtn; // Referências a elementos e funções externas let currentClientId; let loadingContainer; let loadingStatus; let progressFill; let progressText; let progressSteps; let clientDetailsPanel; let safeFetch; let showOnlySection; let scrollToElement; let updateProgress; let showError; let resetProgress; let activeProcessesManager; // Estado dos documentos selecionados let selectedDocuments = []; let currentActionPlanData = null; // Inicializar elementos DOM e referências function initElements() { // Elementos específicos para planos de ação newActionPlanBtn = document.getElementById('new-action-plan-btn'); cancelActionPlanBtn = document.getElementById('cancel-action-plan-btn'); startActionPlanBtn = document.getElementById('start-action-plan-btn'); actionPlanForm = document.getElementById('action-plan-form'); actionPlanTitleInput = document.getElementById('action-plan-title'); availableTranscriptions = document.getElementById('available-transcriptions'); availableAnalyses = document.getElementById('available-analyses'); selectedDocumentsList = document.getElementById('selected-documents-list'); actionPlansList = document.getElementById('action-plans-list'); actionPlanTitleDisplay = document.getElementById('action-plan-title-display'); actionPlanDate = document.getElementById('action-plan-date'); actionPlanDocumentsCount = document.getElementById('action-plan-documents-count'); actionPlanText = document.getElementById('action-plan-text'); exportActionPlanPdfBtn = document.getElementById('export-action-plan-pdf'); copyActionPlanBtn = document.getElementById('copy-action-plan'); backToClientFromPlanBtn = document.getElementById('back-to-client-from-plan'); // Elementos compartilhados loadingContainer = document.getElementById('loading-container'); loadingStatus = document.getElementById('loading-status'); progressFill = document.getElementById('progress-fill'); progressText = document.getElementById('progress-text'); progressSteps = { step1: document.getElementById('step-1'), step2: document.getElementById('step-2'), step3: document.getElementById('step-3'), step4: document.getElementById('step-4') }; clientDetailsPanel = document.getElementById('client-details-panel'); } // Função auxiliar para formatar duração function formatDuration(seconds) { if (!seconds) return '0:00'; const minutes = Math.floor(seconds / 60); const remainingSeconds = Math.floor(seconds % 60); if (minutes < 60) { return `${minutes}:${remainingSeconds.toString().padStart(2, '0')}`; } else { const hours = Math.floor(minutes / 60); const remainingMinutes = minutes % 60; return `${hours}:${remainingMinutes.toString().padStart(2, '0')}:${remainingSeconds.toString().padStart(2, '0')}`; } } // Mostrar formulário de novo plano de ação function showActionPlanForm() { // Limpar formulário actionPlanForm.reset(); selectedDocuments = []; updateSelectedDocumentsList(); // Carregar documentos disponíveis loadAvailableDocuments(); // Mostrar apenas o formulário de plano de ação (estado exclusivo) showOnlySection('action-plan-container'); // Scroll automático para o formulário scrollToElement('action-plan-container'); } // Carregar documentos disponíveis (transcrições e análises) async function loadAvailableDocuments() { if (!currentClientId) return; try { // Carregar transcrições usando safeFetch const transcriptions = await safeFetch(`/api/transcricoes/cliente/${currentClientId}`); if (transcriptions !== null) { // Extrair dados do wrapper da API se presente const transcriptionsArray = Array.isArray(transcriptions) ? transcriptions : (transcriptions?.data || []); renderAvailableTranscriptions(transcriptionsArray); } // Carregar análises usando safeFetch const analyses = await safeFetch(`/api/analises/cliente/${currentClientId}`); if (analyses !== null) { // Extrair dados do wrapper da API se presente const analysesArray = Array.isArray(analyses) ? analyses : (analyses?.data || []); renderAvailableAnalyses(analysesArray); } } catch (error) { console.error('Erro ao carregar documentos:', error); } } // Renderizar transcrições disponíveis function renderAvailableTranscriptions(transcriptions) { if (!transcriptions.length) { availableTranscriptions.innerHTML = `
Nenhuma transcrição disponível
Nenhuma transcrição concluída disponível
Nenhuma análise disponível
Nenhuma análise concluída disponível
Selecione pelo menos um documento acima
Nenhum plano de ação criado
Erro ao carregar planos de ação. Tente novamente.
Seu plano de ação estratégico foi gerado com sucesso e está pronto para visualização.
${cell} | `; }); table += '
---|
${cell} | `; }); table += '
'); formatted = `
${formatted}
`; // Limpar tags vazias formatted = formatted.replace(/<\/p>/g, ''); formatted = formatted.replace(/
( ( (
Nossa IA está analisando os documentos selecionados para criar um plano de ação estratégico personalizado.
Este processo pode levar alguns minutos para garantir a máxima qualidade e relevância.
)/g, '$1');
formatted = formatted.replace(/(<\/ul>)<\/p>/g, '$1');
formatted = formatted.replace(/
)/g, '$1');
formatted = formatted.replace(/(<\/table>)<\/p>/g, '$1');
return formatted;
}
// Deletar plano de ação
async function deleteActionPlan(planId) {
if (!confirm('Tem certeza que deseja excluir este plano de ação? Esta ação não pode ser desfeita.')) {
return;
}
try {
const response = await fetch(`/api/planos-acao/plano/${planId}`, {
method: 'DELETE'
});
if (!response.ok) {
const errorData = await response.json();
throw new Error(errorData.error || 'Erro ao excluir plano de ação');
}
// Recarregar lista
if (currentClientId) {
loadClientActionPlans(currentClientId);
}
console.log('✅ Plano de ação excluído com sucesso');
} catch (error) {
console.error('Erro ao excluir plano de ação:', error);
alert('Não foi possível excluir o plano de ação. Tente novamente.');
}
}
// Submeter formulário de plano de ação
async function submitActionPlanForm(event) {
event.preventDefault();
if (!actionPlanTitleInput.value.trim()) {
alert('O título do plano de ação é obrigatório');
return;
}
if (!selectedDocuments.length) {
alert('Selecione pelo menos um documento');
return;
}
try {
// Registrar processo no painel de processos ativos
const client = window.currentClients.find(c => c._id === currentClientId);
const processId = activeProcessesManager.registerProcess(
'plano-acao',
currentClientId,
`Plano de Ação: ${actionPlanTitleInput.value.trim()}`
);
// Mostrar tela de carregamento IMEDIATAMENTE
showOnlySection('loading-container');
// Adaptar interface para plano de ação
document.querySelector('.loading-text').textContent = 'Gerando plano de ação estratégico...';
loadingStatus.textContent = 'Preparando análise dos documentos selecionados...';
// Resetar e configurar progresso específico para planos de ação
resetProgress();
setupActionPlanProgressSteps();
// Iniciar simulação de progresso imediatamente
startActionPlanProgressSimulation();
// Preparar dados - separar por tipo conforme esperado pelo backend
const transcricaoIds = selectedDocuments
.filter(doc => doc.type === 'transcription')
.map(doc => doc.id);
const analiseIds = selectedDocuments
.filter(doc => doc.type === 'analysis')
.map(doc => doc.id);
const requestData = {
titulo: actionPlanTitleInput.value.trim(),
transcricaoIds,
analiseIds
};
// Debug: verificar dados sendo enviados
console.log('🔍 [DEBUG-PLANO-ACAO] Dados enviados:', requestData);
// Enviar requisição
const response = await fetch(`/api/planos-acao/${currentClientId}/gerar`, {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(requestData)
});
if (!response.ok) {
const errorData = await response.json();
throw new Error(errorData.error || 'Erro ao criar plano de ação');
}
const plan = await response.json();
// Armazenar ID do plano para monitoramento
window.currentActionPlanId = plan.planoId;
// Iniciar monitoramento do progresso real
startActionPlanMonitoring(plan.planoId);
} catch (error) {
console.error('Erro ao criar plano de ação:', error);
showError(error.message || 'Ocorreu um erro ao criar o plano de ação.');
}
}
// Configurar etapas específicas para planos de ação
function setupActionPlanProgressSteps() {
document.getElementById('step-1').querySelector('.step-text').textContent = 'Análise de Documentos';
document.getElementById('step-2').querySelector('.step-text').textContent = 'Processamento IA';
document.getElementById('step-3').querySelector('.step-text').textContent = 'Geração de Estratégias';
document.getElementById('step-4').querySelector('.step-text').textContent = 'Finalização';
}
// Iniciar simulação de progresso para planos de ação
function startActionPlanProgressSimulation() {
// Adicionar informações específicas sobre o processo
const infoElement = document.createElement('div');
infoElement.className = 'action-plan-progress-info';
infoElement.style.cssText = `
margin: 20px 0;
padding: 15px;
background: linear-gradient(135deg, #f8f9fa 0%, #e9ecef 100%);
border-radius: 8px;
border-left: 4px solid #28a745;
font-size: 14px;
line-height: 1.5;
`;
infoElement.innerHTML = `