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:
58
db.php
58
db.php
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user