Files
tilbudgivern/scripts/build-case-latest.js
2026-07-05 08:10:59 +00:00

128 lines
3.8 KiB
JavaScript

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);
});