V0.1
This commit is contained in:
112
server/db.js
112
server/db.js
@@ -2,6 +2,7 @@ import fs from 'fs';
|
||||
import path from 'path';
|
||||
import { DatabaseSync } from 'node:sqlite';
|
||||
import { fileURLToPath } from 'url';
|
||||
import { mergeLegacyAttachmentEventsByDay } from './lib/merge-attachment-events.js';
|
||||
|
||||
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
||||
const dbPath =
|
||||
@@ -16,6 +17,12 @@ const machineCols = db.prepare('PRAGMA table_info(machines)').all();
|
||||
if (!machineCols.some((c) => c.name === 'extras')) {
|
||||
db.exec('ALTER TABLE machines ADD COLUMN extras TEXT');
|
||||
}
|
||||
const machineCols2 = db.prepare('PRAGMA table_info(machines)').all();
|
||||
if (!machineCols2.some((c) => c.name === 'list_status')) {
|
||||
db.exec(
|
||||
"ALTER TABLE machines ADD COLUMN list_status TEXT NOT NULL DEFAULT ''",
|
||||
);
|
||||
}
|
||||
|
||||
const hasCustomerId = machineCols.some((c) => c.name === 'customer_id');
|
||||
const tables = db
|
||||
@@ -30,6 +37,9 @@ const eventCols = db.prepare('PRAGMA table_info(events)').all();
|
||||
if (eventCols.length > 0 && !eventCols.some((c) => c.name === 'remote_duration_seconds')) {
|
||||
db.exec('ALTER TABLE events ADD COLUMN remote_duration_seconds INTEGER');
|
||||
}
|
||||
if (eventCols.length > 0 && !eventCols.some((c) => c.name === 'teamviewer_notes')) {
|
||||
db.exec('ALTER TABLE events ADD COLUMN teamviewer_notes TEXT');
|
||||
}
|
||||
const hasEventExtras = eventCols.some((c) => c.name === 'callback_number');
|
||||
if (eventCols.length > 0 && !hasEventExtras) {
|
||||
db.exec('BEGIN');
|
||||
@@ -44,10 +54,11 @@ if (eventCols.length > 0 && !hasEventExtras) {
|
||||
"teamviewer_id" TEXT,
|
||||
"article_number" TEXT,
|
||||
"remote_duration_seconds" INTEGER,
|
||||
"teamviewer_notes" TEXT,
|
||||
"created_at" TEXT NOT NULL DEFAULT (datetime('now')),
|
||||
FOREIGN KEY ("ticket_id") REFERENCES "tickets" ("id") ON DELETE CASCADE ON UPDATE CASCADE
|
||||
);
|
||||
INSERT INTO events_new (id, ticket_id, type, description, callback_number, teamviewer_id, article_number, remote_duration_seconds, created_at)
|
||||
INSERT INTO events_new (id, ticket_id, type, description, callback_number, teamviewer_id, article_number, remote_duration_seconds, teamviewer_notes, created_at)
|
||||
SELECT
|
||||
id,
|
||||
ticket_id,
|
||||
@@ -57,6 +68,7 @@ if (eventCols.length > 0 && !hasEventExtras) {
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
created_at
|
||||
FROM events;
|
||||
DROP TABLE events;
|
||||
@@ -85,12 +97,13 @@ if (hasCustomerId || hasCustomersTable) {
|
||||
"typ" TEXT NOT NULL,
|
||||
"seriennummer" TEXT NOT NULL,
|
||||
"standort" TEXT NOT NULL,
|
||||
"list_status" TEXT NOT NULL DEFAULT '',
|
||||
"extras" TEXT,
|
||||
"created_at" TEXT NOT NULL DEFAULT (datetime('now')),
|
||||
"updated_at" TEXT NOT NULL DEFAULT (datetime('now'))
|
||||
);
|
||||
INSERT INTO machines_new (id, name, typ, seriennummer, standort, extras, created_at, updated_at)
|
||||
SELECT id, name, typ, seriennummer, standort, extras, created_at, updated_at FROM machines;
|
||||
INSERT INTO machines_new (id, name, typ, seriennummer, standort, list_status, extras, created_at, updated_at)
|
||||
SELECT id, name, typ, seriennummer, standort, COALESCE(list_status, ''), extras, created_at, updated_at FROM machines;
|
||||
DROP TABLE machines;
|
||||
ALTER TABLE machines_new RENAME TO machines;
|
||||
`);
|
||||
@@ -160,4 +173,97 @@ if (!ldapLogTbl) {
|
||||
`);
|
||||
}
|
||||
|
||||
const ticketAttachmentsTbl = db
|
||||
.prepare(
|
||||
"SELECT name FROM sqlite_master WHERE type='table' AND name='ticket_attachments'",
|
||||
)
|
||||
.get();
|
||||
if (!ticketAttachmentsTbl) {
|
||||
db.exec('BEGIN');
|
||||
try {
|
||||
db.exec(`
|
||||
CREATE TABLE events_new (
|
||||
"id" TEXT NOT NULL PRIMARY KEY,
|
||||
"ticket_id" TEXT NOT NULL,
|
||||
"type" TEXT NOT NULL CHECK ("type" IN ('NOTE', 'CALL', 'REMOTE', 'PART', 'SYSTEM', 'ATTACHMENT')),
|
||||
"description" TEXT NOT NULL,
|
||||
"callback_number" TEXT,
|
||||
"teamviewer_id" TEXT,
|
||||
"article_number" TEXT,
|
||||
"remote_duration_seconds" INTEGER,
|
||||
"teamviewer_notes" TEXT,
|
||||
"created_at" TEXT NOT NULL DEFAULT (datetime('now')),
|
||||
FOREIGN KEY ("ticket_id") REFERENCES "tickets" ("id") ON DELETE CASCADE ON UPDATE CASCADE
|
||||
);
|
||||
INSERT INTO events_new (
|
||||
id, ticket_id, type, description, callback_number, teamviewer_id, article_number,
|
||||
remote_duration_seconds, teamviewer_notes, created_at
|
||||
)
|
||||
SELECT
|
||||
id, ticket_id, type, description, callback_number, teamviewer_id, article_number,
|
||||
remote_duration_seconds, teamviewer_notes, created_at
|
||||
FROM events;
|
||||
DROP TABLE events;
|
||||
ALTER TABLE events_new RENAME TO events;
|
||||
`);
|
||||
db.exec(
|
||||
'CREATE INDEX IF NOT EXISTS events_ticket_id_idx ON "events" ("ticket_id")',
|
||||
);
|
||||
db.exec(
|
||||
'CREATE INDEX IF NOT EXISTS events_created_at_idx ON "events" ("created_at")',
|
||||
);
|
||||
db.exec(`
|
||||
CREATE TABLE "ticket_attachments" (
|
||||
"id" TEXT NOT NULL PRIMARY KEY,
|
||||
"event_id" TEXT NOT NULL,
|
||||
"original_name" TEXT NOT NULL,
|
||||
"stored_path" TEXT NOT NULL,
|
||||
"mime_type" TEXT,
|
||||
"size_bytes" INTEGER NOT NULL,
|
||||
"created_at" TEXT NOT NULL DEFAULT (datetime('now')),
|
||||
FOREIGN KEY ("event_id") REFERENCES "events" ("id") ON DELETE CASCADE ON UPDATE CASCADE
|
||||
);
|
||||
CREATE INDEX IF NOT EXISTS ticket_attachments_event_idx ON "ticket_attachments" ("event_id");
|
||||
`);
|
||||
db.exec('COMMIT');
|
||||
} catch (e) {
|
||||
db.exec('ROLLBACK');
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
|
||||
const hasTicketAttachments = db
|
||||
.prepare(
|
||||
"SELECT name FROM sqlite_master WHERE type='table' AND name='ticket_attachments'",
|
||||
)
|
||||
.get();
|
||||
const attachmentMergeDone = db
|
||||
.prepare('SELECT 1 AS ok FROM app_settings WHERE key = ?')
|
||||
.get('attachment_events_merge_day_v1');
|
||||
if (hasTicketAttachments && !attachmentMergeDone) {
|
||||
try {
|
||||
mergeLegacyAttachmentEventsByDay(db);
|
||||
db.prepare('INSERT OR REPLACE INTO app_settings (key, value) VALUES (?, ?)').run(
|
||||
'attachment_events_merge_day_v1',
|
||||
'1',
|
||||
);
|
||||
} catch (e) {
|
||||
console.error('CRM: Zusammenführung Anhang-Events fehlgeschlagen:', e);
|
||||
}
|
||||
}
|
||||
|
||||
const ticketCols = db.prepare('PRAGMA table_info(tickets)').all();
|
||||
if (!ticketCols.some((c) => c.name === 'sla_days')) {
|
||||
db.exec('ALTER TABLE tickets ADD COLUMN sla_days INTEGER');
|
||||
}
|
||||
if (!ticketCols.some((c) => c.name === 'sla_anchor_at')) {
|
||||
db.exec('ALTER TABLE tickets ADD COLUMN sla_anchor_at TEXT');
|
||||
}
|
||||
const ticketCols2 = db.prepare('PRAGMA table_info(tickets)').all();
|
||||
if (ticketCols2.some((c) => c.name === 'sla_anchor_at')) {
|
||||
db.prepare(
|
||||
'UPDATE tickets SET sla_anchor_at = created_at WHERE sla_anchor_at IS NULL',
|
||||
).run();
|
||||
}
|
||||
|
||||
export default db;
|
||||
|
||||
Reference in New Issue
Block a user