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),
|
||||
'sopimuskausi' => trim($l['sopimuskausi'] ?? ''),
|
||||
'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)) {
|
||||
$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;
|
||||
}
|
||||
@@ -1560,7 +1563,7 @@ switch ($action) {
|
||||
'elaskuvalittaja' => '',
|
||||
'ytunnus' => '',
|
||||
'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'),
|
||||
];
|
||||
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 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 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) {
|
||||
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),
|
||||
'sopimuskausi' => $conn['sopimuskausi'] ?? '',
|
||||
'alkupvm' => $conn['alkupvm'] ?? '',
|
||||
'lisatiedot' => $conn['lisatiedot'] ?? '',
|
||||
'vlan' => $conn['vlan'] ?? '',
|
||||
'laite' => $conn['laite'] ?? '',
|
||||
'portti' => $conn['portti'] ?? '',
|
||||
'ip' => $conn['ip'] ?? '',
|
||||
];
|
||||
}, $conns);
|
||||
unset($c['company_id']);
|
||||
@@ -757,8 +764,8 @@ function dbSaveCustomer(string $companyId, array $customer): void {
|
||||
if (!empty($customer['liittymat'])) {
|
||||
foreach ($customer['liittymat'] as $l) {
|
||||
_dbExecute("
|
||||
INSERT INTO customer_connections (customer_id, asennusosoite, postinumero, kaupunki, liittymanopeus, hinta, sopimuskausi, alkupvm, lisatiedot)
|
||||
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
||||
INSERT INTO customer_connections (customer_id, asennusosoite, postinumero, kaupunki, liittymanopeus, hinta, sopimuskausi, alkupvm, vlan, laite, portti, ip)
|
||||
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
||||
", [
|
||||
$customer['id'],
|
||||
$l['asennusosoite'] ?? '',
|
||||
@@ -768,7 +775,10 @@ function dbSaveCustomer(string $companyId, array $customer): void {
|
||||
$l['hinta'] ?? 0,
|
||||
$l['sopimuskausi'] ?? '',
|
||||
$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.postinumero || '').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) ||
|
||||
(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">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">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>
|
||||
${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>`;
|
||||
}).join('');
|
||||
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>
|
||||
</select></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.querySelector('.btn-remove-row').addEventListener('click', () => { div.remove(); renumberLiittymaRows(); });
|
||||
return div;
|
||||
@@ -622,7 +632,10 @@ function collectLiittymatFromForm() {
|
||||
hinta: row.querySelector('.l-hinta').value,
|
||||
sopimuskausi: row.querySelector('.l-sopimuskausi').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