Fix Data Analyzer wallet balance persistence issue

Replace demo JavaScript implementation with real backend processing:
- Remove fake analyzeData() function that only updated frontend
- Add real AJAX submission to /agents/data-analyzer/process/ endpoint
- Implement proper polling for results using request ID
- Add displayResults() function to handle backend responses
- Update wallet balance from server response to ensure persistence
- Remove generateSampleAnalysis() demo function
- Fix wallet balance to persist across page navigation

This resolves the issue where wallet deduction would revert when
navigating to other pages, as the frontend was using demo mode
instead of actual database transactions.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Claude 2025-07-11 22:23:25 +05:30
parent 2d793dfbae
commit 07d61dbf63

View File

@ -577,14 +577,31 @@
return;
}
// Check user authentication
{% if not user.is_authenticated %}
window.location.href = "{% url 'authentication:login' %}";
return;
{% endif %}
// Check wallet balance
const balance = {{ user.wallet_balance|default:0 }};
if (balance < 5.00) {
showToast('Insufficient balance! You need 5.00 AED.', 'error');
setTimeout(() => {
window.location.href = "{% url 'core:wallet' %}";
}, 2000);
return;
}
const analysisType = document.querySelector('input[name="analysisType"]:checked').value;
// Show processing status
document.getElementById('processingStatus').style.display = 'block';
document.getElementById('processButton').disabled = true;
document.getElementById('processButton').innerHTML = '⏳ Processing...';
document.getElementById('analysisResults').style.display = 'none';
// Simulate analysis steps
// Processing steps for user feedback
const steps = [
'Reading file structure...',
'Extracting data patterns...',
@ -600,142 +617,120 @@
currentStep++;
} else {
clearInterval(stepInterval);
completeAnalysis(analysisType);
}
}, 1000);
// Submit form data to backend
const formData = new FormData();
formData.append('file', selectedFile);
formData.append('analysis_type', analysisType);
formData.append('csrfmiddlewaretoken', document.querySelector('[name=csrfmiddlewaretoken]').value);
fetch('/agents/data-analyzer/process/', {
method: 'POST',
body: formData,
headers: {
'X-Requested-With': 'XMLHttpRequest'
}
function completeAnalysis(analysisType) {
// Generate sample analysis report
const analysisReport = generateSampleAnalysis(analysisType);
// Display results
document.getElementById('analysisContent').textContent = analysisReport;
})
.then(response => response.json())
.then(result => {
clearInterval(stepInterval);
if (result.success && result.request_id) {
// Start polling for results
pollForResults(result.request_id);
} else {
// Handle immediate response
document.getElementById('processingStatus').style.display = 'none';
document.getElementById('analysisResults').style.display = 'block';
// Reset button
document.getElementById('processButton').disabled = false;
document.getElementById('processButton').innerHTML = '📊 Analyze Data (5.00 AED)';
// Update wallet balance (demo)
const currentBalance = parseFloat('{{ user.wallet_balance|floatformat:2 }}');
updateWalletBalance(currentBalance - 5.00);
showToast('Data analysis complete! 5.00 AED used.', 'success');
if (result.error) {
showToast(`❌ ${result.error}`, 'error');
} else {
displayResults(result);
}
}
})
.catch(error => {
clearInterval(stepInterval);
console.error('Error:', error);
document.getElementById('processingStatus').style.display = 'none';
document.getElementById('processButton').disabled = false;
document.getElementById('processButton').innerHTML = '📊 Analyze Data (5.00 AED)';
showToast('❌ Network error - please try again', 'error');
});
}
function generateSampleAnalysis(type) {
const fileName = selectedFile.name;
const baseReport = `📊 Data Analysis Report - ${fileName}
// Display analysis results
function displayResults(result) {
const resultsContainer = document.getElementById('analysisResults');
const contentContainer = document.getElementById('analysisContent');
File Information:
- Name: ${fileName}
- Size: ${formatFileSize(selectedFile.size)}
- Type: ${selectedFile.type || 'Unknown'}
- Processed: ${new Date().toLocaleString()}
if (result.success && result.status === 'completed') {
// Use the analysis content from backend
const content = result.report_text || result.analysis_results || result.insights_summary || 'Data analysis completed successfully!';
contentContainer.textContent = content;
resultsContainer.style.display = 'block';
`;
if (type === 'summary') {
return baseReport + `Summary Analysis Results:
Key Findings:
• Data contains 1,247 records across 8 columns
• 94% data completeness rate
• 3 potential outliers identified
• Strong correlation (0.83) between variables A and B
• Trending pattern shows 15% increase over time period
Recommendations:
• Clean missing data in columns 3 and 7
• Investigate outlier values for data quality
• Consider seasonal adjustments for trend analysis
Generated by NetCop AI Data Analyzer Agent`;
// Update wallet balance if provided
if (result.wallet_balance !== undefined) {
updateWalletBalance(result.wallet_balance);
}
if (type === 'detailed') {
return baseReport + `Detailed Analysis Results:
Data Quality Assessment:
• Missing Values: 6% (73 records)
• Duplicate Records: 2% (25 records)
• Outliers Detected: 3 records beyond 3σ threshold
• Data Types: 5 numeric, 2 categorical, 1 datetime
Statistical Summary:
• Mean: 45.67 ± 12.34
• Median: 43.21
• Mode: 42.00
• Range: 15.5 - 89.3
• Skewness: 0.23 (slight right skew)
• Kurtosis: -0.45 (platykurtic distribution)
Correlation Analysis:
• Variable A ↔ Variable B: 0.83 (strong positive)
• Variable C ↔ Variable D: -0.67 (moderate negative)
• Variable E ↔ Variable F: 0.12 (weak positive)
Trend Analysis:
• Linear trend: y = 2.3x + 18.5 (R² = 0.76)
• Seasonal component detected (quarterly pattern)
• 15% overall growth trend identified
Generated by NetCop AI Data Analyzer Agent`;
showToast('✅ Data analysis completed and payment processed!', 'success');
} else {
showToast('❌ Failed to analyze data - no charge applied', 'error');
}
}
if (type === 'statistical') {
return baseReport + `Advanced Statistical Analysis:
// Poll for results
function pollForResults(requestId) {
let pollCount = 0;
const maxPolls = 60; // 60 seconds maximum for data analysis
Descriptive Statistics:
• Count: 1,247 observations
• Mean: 45.67 ± 12.34 (95% CI: 44.98 - 46.36)
• Median: 43.21
• Standard Deviation: 12.34
• Variance: 152.48
• Coefficient of Variation: 27.02%
const pollInterval = setInterval(() => {
pollCount++;
Distribution Analysis:
• Normality Test (Shapiro-Wilk): W = 0.987, p = 0.043
• Distribution appears approximately normal with slight skew
• Outliers: 3 values > 3σ (flagged for review)
fetch(`/agents/data-analyzer/result/${requestId}/`)
.then(response => response.json())
.then(result => {
if (result.status === 'completed' || result.status === 'failed') {
clearInterval(pollInterval);
document.getElementById('processingStatus').style.display = 'none';
document.getElementById('processButton').disabled = false;
document.getElementById('processButton').innerHTML = '📊 Analyze Data (5.00 AED)';
Hypothesis Testing:
• T-test vs. baseline: t = 3.45, p = 0.0006 (significant)
• ANOVA across groups: F = 12.67, p < 0.001 (significant)
• Chi-square test: χ² = 23.45, p = 0.012 (significant)
Regression Analysis:
• R-squared: 0.762 (76.2% variance explained)
• Adjusted R-squared: 0.758
• F-statistic: 234.67, p < 0.001
• Durbin-Watson: 1.98 (no autocorrelation)
Model Coefficients:
• Intercept: 18.5 ± 2.1 (p < 0.001)
• Slope: 2.3 ± 0.3 (p < 0.001)
• Residual Standard Error: 4.67
Time Series Analysis:
• Trend: Increasing (slope = 0.023/month)
• Seasonality: Quarterly pattern detected
• Autocorrelation: Significant at lags 1, 4, 12
• Forecast accuracy: MAPE = 8.3%
Generated by NetCop AI Data Analyzer Agent`;
displayResults(result);
} else if (pollCount >= maxPolls) {
clearInterval(pollInterval);
document.getElementById('processingStatus').style.display = 'none';
document.getElementById('processButton').disabled = false;
document.getElementById('processButton').innerHTML = '📊 Analyze Data (5.00 AED)';
showToast('❌ Processing timeout - please try again', 'error');
}
})
.catch(error => {
console.error('Error polling results:', error);
if (pollCount >= maxPolls) {
clearInterval(pollInterval);
document.getElementById('processingStatus').style.display = 'none';
document.getElementById('processButton').disabled = false;
document.getElementById('processButton').innerHTML = '📊 Analyze Data (5.00 AED)';
showToast('❌ Network error - please try again', 'error');
}
});
}, 1000);
}
return baseReport + 'Analysis complete.';
}
function updateWalletBalance(newBalance) {
document.getElementById('walletBalance').textContent = newBalance.toFixed(2) + ' AED';
// Update header balance if exists
const headerBalance = document.querySelector('[data-wallet-balance]');
if (headerBalance) {
headerBalance.textContent = `💰 ${newBalance.toFixed(2)} AED`;
}
// Update wallet balance display
const balanceElements = document.querySelectorAll('[data-wallet-balance]');
balanceElements.forEach(element => {
element.textContent = `${newBalance.toFixed(2)} AED`;
});
window.currentWalletBalance = newBalance;
}
function copyAnalysisReport() {