Yhdistä Sijainnit ja Laitetilat samaksi konseptiksi

Sijainnit (sites) ja Laitetilat olivat käytännössä sama asia.
Nyt kaikki hallitaan Laitetilat-välilehdeltä:
- DB-migraatio kopioi vanhat sites → laitetilat (sama ID säilyy)
- Laitteiden site_id päivitetty automaattisesti laitetila_id:ksi
- IPAM JOINaa nyt laitetilat-taulua sites:n sijaan
- Sijainnit sub-tab poistettu Tekniikasta
- Laiteformissa yksi "Sijainti / Laitetila" dropdown
- Sites API-endpointit poistettu (sites palauttaa laitetilat)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-12 00:54:03 +02:00
parent 13feb31304
commit 8e9fa76f9c
4 changed files with 45 additions and 211 deletions

50
db.php
View File

@@ -639,6 +639,20 @@ function initDatabase(): void {
try {
$db->query("UPDATE users SET role = 'user' WHERE role = 'admin'");
} catch (\Throwable $e) { /* ohitetaan */ }
// Migraatio: yhdistä sites → laitetilat (kopioi vanhat sijainnit laitetiloiksi)
try {
// Kopioi sites-taulun rivit laitetilat-tauluun (ohita duplikaatit)
$db->query("
INSERT IGNORE INTO laitetilat (id, company_id, nimi, kuvaus, osoite, luotu, muokattu, muokkaaja)
SELECT id, company_id, nimi, '', CONCAT(IFNULL(osoite,''), IF(kaupunki != '', CONCAT(', ', kaupunki), '')), NOW(), NOW(), ''
FROM sites
");
// Päivitä laitteiden laitetila_id vanhoista site_id-viittauksista
$db->query("UPDATE devices SET laitetila_id = site_id WHERE laitetila_id IS NULL AND site_id IS NOT NULL");
// Päivitä IPAM-merkintöjen site_id viittaamaan laitetiloihin (jo sama ID)
// (ei tarvitse muuttaa koska ID:t ovat samat)
} catch (\Throwable $e) { /* ohitetaan */ }
}
// ==================== YRITYKSET ====================
@@ -1040,40 +1054,16 @@ function dbDeleteCustomer(string $customerId): void {
_dbExecute("DELETE FROM customers WHERE id = ?", [$customerId]);
}
// ==================== SIJAINNIT (SITES) ====================
function dbLoadSites(string $companyId): array {
return _dbFetchAll("SELECT * FROM sites WHERE company_id = ? ORDER BY nimi", [$companyId]);
}
function dbSaveSite(string $companyId, array $site): void {
_dbExecute("
INSERT INTO sites (id, company_id, nimi, osoite, kaupunki)
VALUES (:id, :company_id, :nimi, :osoite, :kaupunki)
ON DUPLICATE KEY UPDATE
nimi = VALUES(nimi), osoite = VALUES(osoite), kaupunki = VALUES(kaupunki)
", [
'id' => $site['id'],
'company_id' => $companyId,
'nimi' => $site['nimi'] ?? '',
'osoite' => $site['osoite'] ?? '',
'kaupunki' => $site['kaupunki'] ?? '',
]);
}
function dbDeleteSite(string $siteId): void {
// Nollaa viittaavien laitteiden site_id
_dbExecute("UPDATE devices SET site_id = NULL WHERE site_id = ?", [$siteId]);
_dbExecute("DELETE FROM sites WHERE id = ?", [$siteId]);
}
// ==================== SIJAINNIT (SITES) — POISTETTU, KÄYTETÄÄN LAITETILOJA ====================
// Sites on yhdistetty laitetiloihin. Migraatio kopioi vanhat sites → laitetilat.
// dbLoadSites, dbSaveSite, dbDeleteSite poistettu.
// ==================== LAITTEET (DEVICES) ====================
function dbLoadDevices(string $companyId): array {
$devices = _dbFetchAll("
SELECT d.*, s.nimi AS site_name, lt.nimi AS laitetila_name
SELECT d.*, lt.nimi AS laitetila_name
FROM devices d
LEFT JOIN sites s ON d.site_id = s.id
LEFT JOIN laitetilat lt ON d.laitetila_id = lt.id
WHERE d.company_id = ?
ORDER BY d.nimi
@@ -1121,9 +1111,9 @@ function dbDeleteDevice(string $deviceId): void {
function dbLoadIpam(string $companyId): array {
$rows = _dbFetchAll("
SELECT i.*, s.nimi AS site_name
SELECT i.*, lt.nimi AS site_name
FROM ipam i
LEFT JOIN sites s ON i.site_id = s.id
LEFT JOIN laitetilat lt ON i.site_id = lt.id
WHERE i.company_id = ?
ORDER BY i.tyyppi, i.vlan_id, i.verkko
", [$companyId]);