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:
57
api.php
57
api.php
@@ -3256,7 +3256,7 @@ switch ($action) {
|
||||
$input = json_decode(file_get_contents('php://input'), true);
|
||||
$id = $input['id'] ?? '';
|
||||
$type = $input['type'] ?? '';
|
||||
$validTypes = ['laskutus', 'tekniikka', 'vika', 'muu'];
|
||||
$validTypes = array_map(fn($t) => $t['value'], dbLoadTicketTypes($companyId));
|
||||
if (!in_array($type, $validTypes)) {
|
||||
http_response_code(400);
|
||||
echo json_encode(['error' => 'Virheellinen tyyppi']);
|
||||
@@ -3511,6 +3511,61 @@ switch ($action) {
|
||||
echo json_encode(['success' => true]);
|
||||
break;
|
||||
|
||||
case 'ticket_types':
|
||||
requireAuth();
|
||||
$companyId = requireCompany();
|
||||
echo json_encode(dbLoadTicketTypes($companyId));
|
||||
break;
|
||||
|
||||
case 'ticket_type_save':
|
||||
requireAuth();
|
||||
$companyId = requireCompany();
|
||||
if ($method !== 'POST') break;
|
||||
$input = json_decode(file_get_contents('php://input'), true);
|
||||
$value = preg_replace('/[^a-z0-9_-]/', '', strtolower(trim($input['value'] ?? '')));
|
||||
$label = trim($input['label'] ?? '');
|
||||
if (!$value || !$label) {
|
||||
http_response_code(400);
|
||||
echo json_encode(['error' => 'Tunnus ja nimi vaaditaan']);
|
||||
break;
|
||||
}
|
||||
dbSaveTicketType($companyId, [
|
||||
'id' => $input['id'] ?? null,
|
||||
'value' => $value,
|
||||
'label' => $label,
|
||||
'color' => $input['color'] ?? '',
|
||||
'sort_order' => intval($input['sort_order'] ?? 0),
|
||||
]);
|
||||
dbAddLog($companyId, currentUser(), 'config_update', '', '', 'Tikettityyppi: ' . $label);
|
||||
echo json_encode(dbLoadTicketTypes($companyId));
|
||||
break;
|
||||
|
||||
case 'ticket_type_delete':
|
||||
requireAuth();
|
||||
$companyId = requireCompany();
|
||||
if ($method !== 'POST') break;
|
||||
$input = json_decode(file_get_contents('php://input'), true);
|
||||
$value = $input['value'] ?? '';
|
||||
if (!$value) {
|
||||
http_response_code(400);
|
||||
echo json_encode(['error' => 'Tyyppi puuttuu']);
|
||||
break;
|
||||
}
|
||||
// Tarkista onko käytössä
|
||||
$tickets = dbLoadTickets($companyId);
|
||||
$inUse = 0;
|
||||
foreach ($tickets as $t) {
|
||||
if (($t['type'] ?? '') === $value) $inUse++;
|
||||
}
|
||||
if ($inUse > 0) {
|
||||
http_response_code(400);
|
||||
echo json_encode(['error' => "Tyyppiä käytetään {$inUse} tiketissä, ei voi poistaa"]);
|
||||
break;
|
||||
}
|
||||
dbDeleteTicketType($companyId, $value);
|
||||
echo json_encode(dbLoadTicketTypes($companyId));
|
||||
break;
|
||||
|
||||
case 'ticket_priority':
|
||||
requireAuth();
|
||||
$companyId = requireCompanyOrParam();
|
||||
|
||||
Reference in New Issue
Block a user