Files
tilbudgivern/find-algorithm-bug.js
alexpolo1 1d79f4710d feat: Implement comprehensive analytics population and data synchronization
- Added SimpleAnalyticsPopulator class for populating project, employee, customer analytics, and daily metrics.
- Integrated MySQL database connections for tilbudgivern and ordrestyring_local databases.
- Developed sync_ordrestyring_data_old.sh script for comprehensive data synchronization from Ordrestyring API.
- Created test scripts for analytics API and services to validate functionality and data integrity.
- Introduced FixedHistoricalQuoteCalculator and HistoricalQuoteCalculator for generating quotes based on historical data.
- Implemented vary-profit-margins.js to introduce variability in profit margins based on project size and customer type.
2025-10-14 13:06:02 +00:00

66 lines
2.7 KiB
JavaScript

const mysql = require('mysql2/promise');
const dbConfig = {
host: 'localhost',
user: 'ordrestyring_user',
password: 'secure_password123',
database: 'ordrestyring_local'
};
async function findAlgorithmBug() {
const connection = await mysql.createConnection(dbConfig);
console.log('=== ALGORITHM BUG ANALYSIS ===\n');
// Test the actual algorithm step by step
// 1. Check market hours data
const [marketHours] = await connection.execute(`
SELECT
COUNT(*) as total_entries,
AVG(oh.duration_hours) as avg_hours_per_task,
AVG(ocm.total_sales / oh.duration_hours) as avg_hourly_rate
FROM ordrestyring_hours oh
LEFT JOIN ordrestyring_case_materials ocm ON oh.case_number = ocm.case_number
WHERE oh.duration_hours > 0
AND ocm.total_sales > 0
LIMIT 1
`);
console.log('MARKET DATA:');
console.log('- Total timer entries:', marketHours[0].total_entries);
console.log('- Gennemsnit timer per task:', Number(marketHours[0].avg_hours_per_task || 0).toFixed(2));
console.log('- Gennemsnit timepris:', Number(marketHours[0].avg_hourly_rate || 0).toFixed(2));
// 2. Test the faulty calculation
const avgHoursPerTask = Number(marketHours[0].avg_hours_per_task || 8);
const baseHoursNewCustomer = avgHoursPerTask * 25; // This is the problem!
console.log('\n=== BUG IDENTIFIED ===');
console.log(`Avg hours per task: ${avgHoursPerTask}`);
console.log(`Base hours for new customer: ${avgHoursPerTask} * 25 = ${baseHoursNewCustomer}`);
console.log(`Dette giver: ${baseHoursNewCustomer * 1.0 * 1.1} timer efter multipliers`);
console.log(`Med timepris 450kr: ${baseHoursNewCustomer * 1.0 * 1.1 * 450} kr labor cost`);
// 3. Check what a realistic calculation should be
const [realisticData] = await connection.execute(`
SELECT
AVG(oh.duration_hours) as avg_hours,
COUNT(DISTINCT oh.case_number) as cases,
AVG(ocm.total_sales) as avg_case_value
FROM ordrestyring_hours oh
LEFT JOIN ordrestyring_case_materials ocm ON oh.case_number = ocm.case_number
WHERE oh.duration_hours BETWEEN 800 AND 1200
AND ocm.total_sales > 0
`);
console.log('\n=== REALISTIC COMPARISON ===');
console.log('Cases with 800-1200 timer:');
console.log('- Gennemsnit timer:', Number(realisticData[0].avg_hours || 0).toFixed(2));
console.log('- Antal cases:', realisticData[0].cases);
console.log('- Gennemsnit case værdi:', Number(realisticData[0].avg_case_value || 0).toFixed(0));
await connection.end();
}
findAlgorithmBug().catch(console.error);