feat: asiakasyhteyksiin erilliset VLAN/laite/portti/IP-kentät
Korvattu yleinen lisätiedot-tekstikenttä neljällä erillisellä kentällä (vlan, laite, portti, ip) jotta tiedoista voi hakea ja filtteröidä tarkemmin. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
9
api.php
9
api.php
@@ -597,11 +597,14 @@ function parseLiittymat(array $input): array {
|
|||||||
'hinta' => floatval($l['hinta'] ?? 0),
|
'hinta' => floatval($l['hinta'] ?? 0),
|
||||||
'sopimuskausi' => trim($l['sopimuskausi'] ?? ''),
|
'sopimuskausi' => trim($l['sopimuskausi'] ?? ''),
|
||||||
'alkupvm' => trim($l['alkupvm'] ?? ''),
|
'alkupvm' => trim($l['alkupvm'] ?? ''),
|
||||||
'lisatiedot' => trim($l['lisatiedot'] ?? ''),
|
'vlan' => trim($l['vlan'] ?? ''),
|
||||||
|
'laite' => trim($l['laite'] ?? ''),
|
||||||
|
'portti' => trim($l['portti'] ?? ''),
|
||||||
|
'ip' => trim($l['ip'] ?? ''),
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
if (empty($liittymat)) {
|
if (empty($liittymat)) {
|
||||||
$liittymat[] = ['asennusosoite' => '', 'postinumero' => '', 'kaupunki' => '', 'liittymanopeus' => '', 'hinta' => 0, 'sopimuskausi' => '', 'alkupvm' => '', 'lisatiedot' => ''];
|
$liittymat[] = ['asennusosoite' => '', 'postinumero' => '', 'kaupunki' => '', 'liittymanopeus' => '', 'hinta' => 0, 'sopimuskausi' => '', 'alkupvm' => '', 'vlan' => '', 'laite' => '', 'portti' => '', 'ip' => ''];
|
||||||
}
|
}
|
||||||
return $liittymat;
|
return $liittymat;
|
||||||
}
|
}
|
||||||
@@ -1560,7 +1563,7 @@ switch ($action) {
|
|||||||
'elaskuvalittaja' => '',
|
'elaskuvalittaja' => '',
|
||||||
'ytunnus' => '',
|
'ytunnus' => '',
|
||||||
'lisatiedot' => $lead['muistiinpanot'] ?? '',
|
'lisatiedot' => $lead['muistiinpanot'] ?? '',
|
||||||
'liittymat' => [['asennusosoite' => $lead['osoite'] ?? '', 'postinumero' => '', 'kaupunki' => $lead['kaupunki'] ?? '', 'liittymanopeus' => '', 'hinta' => 0, 'sopimuskausi' => '', 'alkupvm' => '', 'lisatiedot' => '']],
|
'liittymat' => [['asennusosoite' => $lead['osoite'] ?? '', 'postinumero' => '', 'kaupunki' => $lead['kaupunki'] ?? '', 'liittymanopeus' => '', 'hinta' => 0, 'sopimuskausi' => '', 'alkupvm' => '', 'vlan' => '', 'laite' => '', 'portti' => '', 'ip' => '']],
|
||||||
'luotu' => date('Y-m-d H:i:s'),
|
'luotu' => date('Y-m-d H:i:s'),
|
||||||
];
|
];
|
||||||
dbSaveCustomer($companyId, $customer);
|
dbSaveCustomer($companyId, $customer);
|
||||||
|
|||||||
18
db.php
18
db.php
@@ -409,6 +409,10 @@ function initDatabase(): void {
|
|||||||
"ALTER TABLE companies ADD COLUMN enabled_modules TEXT DEFAULT '' AFTER cors_origins",
|
"ALTER TABLE companies ADD COLUMN enabled_modules TEXT DEFAULT '' AFTER cors_origins",
|
||||||
"ALTER TABLE users MODIFY COLUMN role ENUM('superadmin','admin','user') DEFAULT 'user'",
|
"ALTER TABLE users MODIFY COLUMN role ENUM('superadmin','admin','user') DEFAULT 'user'",
|
||||||
"ALTER TABLE customer_connections ADD COLUMN lisatiedot TEXT DEFAULT '' AFTER alkupvm",
|
"ALTER TABLE customer_connections ADD COLUMN lisatiedot TEXT DEFAULT '' AFTER alkupvm",
|
||||||
|
"ALTER TABLE customer_connections ADD COLUMN vlan VARCHAR(20) DEFAULT '' AFTER lisatiedot",
|
||||||
|
"ALTER TABLE customer_connections ADD COLUMN laite VARCHAR(100) DEFAULT '' AFTER vlan",
|
||||||
|
"ALTER TABLE customer_connections ADD COLUMN portti VARCHAR(100) DEFAULT '' AFTER laite",
|
||||||
|
"ALTER TABLE customer_connections ADD COLUMN ip VARCHAR(100) DEFAULT '' AFTER portti",
|
||||||
];
|
];
|
||||||
foreach ($alters as $sql) {
|
foreach ($alters as $sql) {
|
||||||
try { $db->query($sql); } catch (\Throwable $e) { /* sarake on jo olemassa / jo ajettu */ }
|
try { $db->query($sql); } catch (\Throwable $e) { /* sarake on jo olemassa / jo ajettu */ }
|
||||||
@@ -703,7 +707,10 @@ function dbLoadCustomers(string $companyId): array {
|
|||||||
'hinta' => (float)($conn['hinta'] ?? 0),
|
'hinta' => (float)($conn['hinta'] ?? 0),
|
||||||
'sopimuskausi' => $conn['sopimuskausi'] ?? '',
|
'sopimuskausi' => $conn['sopimuskausi'] ?? '',
|
||||||
'alkupvm' => $conn['alkupvm'] ?? '',
|
'alkupvm' => $conn['alkupvm'] ?? '',
|
||||||
'lisatiedot' => $conn['lisatiedot'] ?? '',
|
'vlan' => $conn['vlan'] ?? '',
|
||||||
|
'laite' => $conn['laite'] ?? '',
|
||||||
|
'portti' => $conn['portti'] ?? '',
|
||||||
|
'ip' => $conn['ip'] ?? '',
|
||||||
];
|
];
|
||||||
}, $conns);
|
}, $conns);
|
||||||
unset($c['company_id']);
|
unset($c['company_id']);
|
||||||
@@ -757,8 +764,8 @@ function dbSaveCustomer(string $companyId, array $customer): void {
|
|||||||
if (!empty($customer['liittymat'])) {
|
if (!empty($customer['liittymat'])) {
|
||||||
foreach ($customer['liittymat'] as $l) {
|
foreach ($customer['liittymat'] as $l) {
|
||||||
_dbExecute("
|
_dbExecute("
|
||||||
INSERT INTO customer_connections (customer_id, asennusosoite, postinumero, kaupunki, liittymanopeus, hinta, sopimuskausi, alkupvm, lisatiedot)
|
INSERT INTO customer_connections (customer_id, asennusosoite, postinumero, kaupunki, liittymanopeus, hinta, sopimuskausi, alkupvm, vlan, laite, portti, ip)
|
||||||
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
||||||
", [
|
", [
|
||||||
$customer['id'],
|
$customer['id'],
|
||||||
$l['asennusosoite'] ?? '',
|
$l['asennusosoite'] ?? '',
|
||||||
@@ -768,7 +775,10 @@ function dbSaveCustomer(string $companyId, array $customer): void {
|
|||||||
$l['hinta'] ?? 0,
|
$l['hinta'] ?? 0,
|
||||||
$l['sopimuskausi'] ?? '',
|
$l['sopimuskausi'] ?? '',
|
||||||
$l['alkupvm'] ?? '',
|
$l['alkupvm'] ?? '',
|
||||||
$l['lisatiedot'] ?? '',
|
$l['vlan'] ?? '',
|
||||||
|
$l['laite'] ?? '',
|
||||||
|
$l['portti'] ?? '',
|
||||||
|
$l['ip'] ?? '',
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
21
script.js
21
script.js
@@ -307,7 +307,11 @@ function renderTable() {
|
|||||||
(l.asennusosoite || '').toLowerCase().includes(query) ||
|
(l.asennusosoite || '').toLowerCase().includes(query) ||
|
||||||
(l.postinumero || '').toLowerCase().includes(query) ||
|
(l.postinumero || '').toLowerCase().includes(query) ||
|
||||||
(l.kaupunki || '').toLowerCase().includes(query) ||
|
(l.kaupunki || '').toLowerCase().includes(query) ||
|
||||||
(l.liittymanopeus || '').toLowerCase().includes(query)
|
(l.liittymanopeus || '').toLowerCase().includes(query) ||
|
||||||
|
(l.vlan || '').toLowerCase().includes(query) ||
|
||||||
|
(l.laite || '').toLowerCase().includes(query) ||
|
||||||
|
(l.portti || '').toLowerCase().includes(query) ||
|
||||||
|
(l.ip || '').toLowerCase().includes(query)
|
||||||
);
|
);
|
||||||
return c.yritys.toLowerCase().includes(query) ||
|
return c.yritys.toLowerCase().includes(query) ||
|
||||||
(c.yhteyshenkilö || '').toLowerCase().includes(query) || inL;
|
(c.yhteyshenkilö || '').toLowerCase().includes(query) || inL;
|
||||||
@@ -484,8 +488,11 @@ function showDetail(id) {
|
|||||||
<div class="detail-item"><div class="detail-label">Hinta / kk</div><div class="detail-value price-cell">${formatPrice(l.hinta)}</div></div>
|
<div class="detail-item"><div class="detail-label">Hinta / kk</div><div class="detail-value price-cell">${formatPrice(l.hinta)}</div></div>
|
||||||
<div class="detail-item"><div class="detail-label">Sopimuskausi</div><div class="detail-value">${l.sopimuskausi ? l.sopimuskausi + ' kk' : '-'}</div></div>
|
<div class="detail-item"><div class="detail-label">Sopimuskausi</div><div class="detail-value">${l.sopimuskausi ? l.sopimuskausi + ' kk' : '-'}</div></div>
|
||||||
<div class="detail-item"><div class="detail-label">Alkaen</div><div class="detail-value">${detailVal(l.alkupvm)}</div></div>
|
<div class="detail-item"><div class="detail-label">Alkaen</div><div class="detail-value">${detailVal(l.alkupvm)}</div></div>
|
||||||
|
<div class="detail-item"><div class="detail-label">VLAN</div><div class="detail-value">${detailVal(l.vlan)}</div></div>
|
||||||
|
<div class="detail-item"><div class="detail-label">Laite</div><div class="detail-value">${detailVal(l.laite)}</div></div>
|
||||||
|
<div class="detail-item"><div class="detail-label">Portti</div><div class="detail-value">${detailVal(l.portti)}</div></div>
|
||||||
|
<div class="detail-item"><div class="detail-label">IP</div><div class="detail-value">${detailVal(l.ip)}</div></div>
|
||||||
</div>
|
</div>
|
||||||
${l.lisatiedot ? `<div class="detail-item" style="margin-top:0.25rem"><div class="detail-label">Lisätiedot</div><div class="detail-value" style="white-space:pre-line">${esc(l.lisatiedot)}</div></div>` : ''}
|
|
||||||
</div>`;
|
</div>`;
|
||||||
}).join('');
|
}).join('');
|
||||||
const totalH = liittymat.reduce((s, l) => s + (parseFloat(l.hinta) || 0), 0);
|
const totalH = liittymat.reduce((s, l) => s + (parseFloat(l.hinta) || 0), 0);
|
||||||
@@ -600,7 +607,10 @@ function createLiittymaRow(data = {}, index = 0) {
|
|||||||
<option value="36" ${data.sopimuskausi === '36' ? 'selected' : ''}>36 kk</option>
|
<option value="36" ${data.sopimuskausi === '36' ? 'selected' : ''}>36 kk</option>
|
||||||
</select></div>
|
</select></div>
|
||||||
<div class="form-group"><label>Alkaen</label><input type="date" class="l-alkupvm" value="${esc(data.alkupvm || '')}"></div>
|
<div class="form-group"><label>Alkaen</label><input type="date" class="l-alkupvm" value="${esc(data.alkupvm || '')}"></div>
|
||||||
<div class="form-group full-width"><label>Lisätiedot <small style="font-weight:normal;color:var(--text-light)">(kytkin, portti, IP, VLAN yms.)</small></label><textarea class="l-lisatiedot" rows="2" placeholder="esim. SW1 port Gi0/1, IP 10.0.0.5, VLAN 100">${esc(data.lisatiedot || '')}</textarea></div>
|
<div class="form-group"><label>VLAN</label><input type="text" class="l-vlan" value="${esc(data.vlan || '')}" placeholder="esim. 100"></div>
|
||||||
|
<div class="form-group"><label>Laite</label><input type="text" class="l-laite" value="${esc(data.laite || '')}" placeholder="esim. SW-CORE-01"></div>
|
||||||
|
<div class="form-group"><label>Portti</label><input type="text" class="l-portti" value="${esc(data.portti || '')}" placeholder="esim. Gi0/1"></div>
|
||||||
|
<div class="form-group"><label>IP</label><input type="text" class="l-ip" value="${esc(data.ip || '')}" placeholder="esim. 10.0.0.5"></div>
|
||||||
</div>`;
|
</div>`;
|
||||||
div.querySelector('.btn-remove-row').addEventListener('click', () => { div.remove(); renumberLiittymaRows(); });
|
div.querySelector('.btn-remove-row').addEventListener('click', () => { div.remove(); renumberLiittymaRows(); });
|
||||||
return div;
|
return div;
|
||||||
@@ -622,7 +632,10 @@ function collectLiittymatFromForm() {
|
|||||||
hinta: row.querySelector('.l-hinta').value,
|
hinta: row.querySelector('.l-hinta').value,
|
||||||
sopimuskausi: row.querySelector('.l-sopimuskausi').value,
|
sopimuskausi: row.querySelector('.l-sopimuskausi').value,
|
||||||
alkupvm: row.querySelector('.l-alkupvm').value,
|
alkupvm: row.querySelector('.l-alkupvm').value,
|
||||||
lisatiedot: row.querySelector('.l-lisatiedot').value,
|
vlan: row.querySelector('.l-vlan').value,
|
||||||
|
laite: row.querySelector('.l-laite').value,
|
||||||
|
portti: row.querySelector('.l-portti').value,
|
||||||
|
ip: row.querySelector('.l-ip').value,
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user