128 lines
3.8 KiB
JavaScript
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);
|
|
});
|