const path = require('path'); const mysql = require('mysql2/promise'); require('dotenv').config({ path: path.join(__dirname, '..', 'backend', '.env') }); function toDateTimeExpr(columnExpr) { return `CASE WHEN ${columnExpr} IS NULL OR ${columnExpr} = 0 THEN NULL WHEN ${columnExpr} > 100000000000 THEN FROM_UNIXTIME(${columnExpr} / 1000) ELSE FROM_UNIXTIME(${columnExpr}) END`; } async function main() { if (!process.env.DB_PASSWORD) { throw new Error('DB_PASSWORD is required'); } const conn = await mysql.createConnection({ host: process.env.DB_HOST || '127.0.0.1', port: parseInt(process.env.DB_PORT, 10) || 3306, user: process.env.DB_USER || 'tilbudgivern_service', password: process.env.DB_PASSWORD, database: process.env.DB_NAME || 'tilbudgivern', multipleStatements: true }); try { await conn.execute( ` CREATE TABLE IF NOT EXISTS ordrestyring_case_latest ( case_number VARCHAR(64) NOT NULL PRIMARY KEY, customer_number VARCHAR(255) NULL, offer_number INT NULL, description TEXT NULL, remarks TEXT NULL, work_done TEXT NULL, status INT NULL, created_at_ordrestyring DATETIME NULL, updated_at_ordrestyring DATETIME NULL, source_case_id INT NULL, synced_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, INDEX idx_case_latest_customer_number (customer_number), INDEX idx_case_latest_offer_number (offer_number), INDEX idx_case_latest_updated_at (updated_at_ordrestyring) ) ` ); const createdExpr = toDateTimeExpr('c.created_at'); const updatedExpr = toDateTimeExpr('COALESCE(NULLIF(c.updated_at, 0), NULLIF(c.creation_date, 0), NULLIF(c.created_at, 0))'); await conn.execute('TRUNCATE TABLE ordrestyring_case_latest'); await conn.execute( ` INSERT INTO ordrestyring_case_latest ( case_number, customer_number, offer_number, description, remarks, work_done, status, created_at_ordrestyring, updated_at_ordrestyring, source_case_id ) SELECT ranked.case_number, ranked.customer_number, ranked.offer_number, ranked.description, ranked.remarks, ranked.work_done, ranked.status, ranked.created_at_ordrestyring, ranked.updated_at_ordrestyring, ranked.source_case_id FROM ( SELECT c.case_number, c.customer_number, c.offer_number, c.description, c.remarks, c.work_done, c.status, ${createdExpr} AS created_at_ordrestyring, ${updatedExpr} AS updated_at_ordrestyring, c.id AS source_case_id, ROW_NUMBER() OVER ( PARTITION BY c.case_number ORDER BY COALESCE(NULLIF(c.updated_at, 0), NULLIF(c.creation_date, 0), NULLIF(c.created_at, 0), 0) DESC, c.id DESC ) AS rn FROM ordrestyring_local.cases c WHERE c.case_number IS NOT NULL AND c.case_number <> '' ) ranked WHERE ranked.rn = 1 ` ); const [[stats]] = await conn.execute( ` SELECT COUNT(*) AS rows_inserted, COUNT(DISTINCT case_number) AS distinct_case_numbers FROM ordrestyring_case_latest ` ); console.log(JSON.stringify({ table: 'ordrestyring_case_latest', rowsInserted: Number(stats.rows_inserted || 0), distinctCaseNumbers: Number(stats.distinct_case_numbers || 0) }, null, 2)); } finally { await conn.end(); } } main().catch((error) => { console.error(error); process.exit(1); });