Asiakaspalvelu: alinavi-uudelleenjärjestely + tikettityyppien hallinta

Vastauspohjat, Säännöt ja Asetukset siirretty omiksi alinaveikseen
tikettilistan overlay-napeista. Säännöt-välilehdelle lisätty
tikettityyppien hallinta (lisää/poista). Tyypit tallennetaan
tietokantaan yrityskohtaisesti ja populoidaan dynaamisesti
kaikkiin dropdown-valikoihin.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-12 12:52:54 +02:00
parent 306dc6c5cc
commit 656b5042e4
5 changed files with 377 additions and 214 deletions

58
db.php
View File

@@ -346,6 +346,18 @@ function initDatabase(): void {
INDEX idx_company (company_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4",
"CREATE TABLE IF NOT EXISTS ticket_types (
id VARCHAR(20) PRIMARY KEY,
company_id VARCHAR(50) NOT NULL,
value VARCHAR(50) NOT NULL,
label VARCHAR(100) NOT NULL,
color VARCHAR(20) DEFAULT '',
sort_order INT DEFAULT 0,
UNIQUE KEY uk_company_value (company_id, value),
FOREIGN KEY (company_id) REFERENCES companies(id) ON DELETE CASCADE,
INDEX idx_company (company_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4",
"CREATE TABLE IF NOT EXISTS customer_priority_emails (
id INT AUTO_INCREMENT PRIMARY KEY,
company_id VARCHAR(50) NOT NULL,
@@ -1582,6 +1594,52 @@ function dbDeleteTicketRule(string $ruleId): void {
_dbExecute("DELETE FROM ticket_rules WHERE id = ?", [$ruleId]);
}
// ==================== TIKETTITYYPIT ====================
function dbLoadTicketTypes(string $companyId): array {
$types = _dbFetchAll("SELECT * FROM ticket_types WHERE company_id = ? ORDER BY sort_order, label", [$companyId]);
// Jos ei tyyppejä, luo oletukset
if (empty($types)) {
$defaults = [
['value' => 'laskutus', 'label' => 'Laskutus', 'sort_order' => 1],
['value' => 'tekniikka', 'label' => 'Tekniikka', 'sort_order' => 2],
['value' => 'vika', 'label' => 'Vika', 'sort_order' => 3],
['value' => 'abuse', 'label' => 'Abuse', 'sort_order' => 4],
['value' => 'muu', 'label' => 'Muu', 'sort_order' => 5],
];
foreach ($defaults as $d) {
dbSaveTicketType($companyId, $d);
}
$types = _dbFetchAll("SELECT * FROM ticket_types WHERE company_id = ? ORDER BY sort_order, label", [$companyId]);
}
foreach ($types as &$t) {
$t['sort_order'] = (int)($t['sort_order'] ?? 0);
unset($t['company_id']);
}
return $types;
}
function dbSaveTicketType(string $companyId, array $type): void {
$id = $type['id'] ?? generateId();
_dbExecute("
INSERT INTO ticket_types (id, company_id, value, label, color, sort_order)
VALUES (:id, :company_id, :value, :label, :color, :sort_order)
ON DUPLICATE KEY UPDATE
label = VALUES(label), color = VALUES(color), sort_order = VALUES(sort_order)
", [
'id' => $id,
'company_id' => $companyId,
'value' => $type['value'] ?? '',
'label' => $type['label'] ?? '',
'color' => $type['color'] ?? '',
'sort_order' => $type['sort_order'] ?? 0,
]);
}
function dbDeleteTicketType(string $companyId, string $value): void {
_dbExecute("DELETE FROM ticket_types WHERE company_id = ? AND value = ?", [$companyId, $value]);
}
// ==================== YRITYKSEN API-ASETUKSET ====================
function dbGetCompanyConfig(string $companyId): array {