Uusi todo_subtasks-taulu + 3 API-endpointtia (add/toggle/delete).
Tehtävän lukunäkymässä checkbox-lista osatehtäville, lisäys
Enter-näppäimellä tai Lisää-napilla. Valmiit yliviivataan.
Tehtävälistassa näkyy edistyminen (esim. ☑ 2/5).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Asiakaspalvelun tikettinäkymässä uusi nappi joka avaa
TODO-tehtävälomakkeen esitäytetyillä tiedoilla: otsikko
(tikettinumero + aihe), kategoria (tiketin tyypistä),
prioriteetti ja kuvaus (lähettäjän tiedot).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
isAdmin() ei ollut olemassa, oikea funktio on isCompanyAdmin().
Aiheutti PHP fatal errorin ja tyhjän vastauksen.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
dbLoadTodo hakee comments+time_entries lisätauluista jotka
saattoivat puuttua/kaatua -> tyhjä vastaus. Nyt käytetään
kevyttä SELECT type,company_id kyselyä oikeustarkistukseen
ja suoraa UPDATE-lausetta. Koko endpoint try-catchissä.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
apiCall palauttaa nyt selkeän virheen jos palvelimen vastaus
ei ole validia JSON:ia (+ logittaa console.error). todo_status
palauttaa JSON-virheen myös edge-caseissa.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
dbSaveTodo kaatui koska dbLoadTodo palauttaa ylimääräisiä
kenttiä (comments, time_entries, total_hours). Vaihdettu
suoraan UPDATE-lauseeksi + lisätty JSON-virhevastaukset
kaikkiin virhetilanteisiin (404/403/500).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
updateTaskField lataa nyt lukunäkymän uudelleen statuksen/
vastuuhenkilön muutoksen jälkeen, jotta dropdown ja badget
päivittyvät oikein.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Uusi category-sarake todosiin. Näkyy listassa badgena, lomakkeessa
dropdownina ja lukunäkymässä. Tyypillä voi myös suodattaa listaa.
Värikoodatut badget kullekin tyypille.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Tehtävät ja kehitysehdotukset näytetään nyt taulukkoriveinä
(kuten tukitiketit) kortti-gridin sijaan. Tehtävät lajitellaan
deadlinen mukaan (lähimmät ensin), valmiit loppuun. Myöhästyneet
rivit punaisella ja pian erääntyvät keltaisella taustalla.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Talon sisäinen tehtävienhallinta kahdella alatabilla:
Tehtävät (admin luo):
- Prioriteetti (normaali/tärkeä/kiireellinen), status, deadline
- Vastuuhenkilö-osoitus, inline-muokkaus lukunäkymässä
- Aikakirjaukset: pvm, tunnit, kuvaus - kaikki voivat kirjata
- Myöhästyneet = punainen reunus, lähestyvät = keltainen
- Kommentointi kaikille käyttäjille
Kehitysehdotukset (kaikki voivat luoda):
- Status: ehdotettu → harkinnassa → toteutettu/hylätty (admin muuttaa)
- Kommentointi kaikille
- Ehdottaja voi muokata omia
Tietokanta: 3 taulua (todos, todo_comments, todo_time_entries)
API: 10 endpointtia oikeustarkistuksineen
Frontend: Sub-tab navigointi, kortti-grid, 3-näkymämalli per alatabi
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Screenshottien lisääminen ohjeisiin nyt helpompaa:
- Ctrl+V / Cmd+V: liitä kuvakaappaus suoraan leikepöydältä editoriin
- Drag & drop: raahaa kuvatiedostoja suoraan textarea-editoriin
- Upload-placeholder näkyy latauksen aikana (![Ladataan: ...]())
- Vihjeet editorin alla kertovat käytettävissä olevat tavat
- Kuva-lightbox: klikkaa kuvaa lukunäkymässä → avautuu isona
- Kuvien hover-efekti (zoom-in kursori, kevyt varjo)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Vanha fetchBody haki aina BODY[1] ja käytti haurasta regexiä
koodauksen tunnistamiseen BODYSTRUCTURE:sta → monet viestit
jäivät raakana base64/quoted-printable -muodossa.
Uusi toteutus:
- Parsii BODYSTRUCTURE:n nesting-syvyyden → oikea section-numero
(TEXT/1/1.1 riippuen onko single-part/multipart/sisäkkäinen)
- Joustava regex koodauksen tunnistamiseen (tukee NIL/"str" body-id/desc)
- Automaattinen QP-tunnistus (=XX -koodien haku) base64:n lisäksi
- extractPlainFromMultipart: jos BODY[1] palauttaa raakaa
multipart-dataa boundary-rajoineen, parsii text/plain tai
text/html suoraan MIME-osista
- error_log debug-lokit BODYSTRUCTURE/section/encoding tiedoilla
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Vapaa tekstikenttä → select-dropdown valmiilla vaihtoehdoilla:
- Tyyppi: Reititin, Kytkin, Palomuuri, Tukiasema, Palvelin, OLT, ONT, Mediamuunnin, Muu
- Funktio: PE/EDGE/CPE Reititin, Core/Aggregaatio/Access-kytkin, WAN GW, WLAN Controller, Asiakaslaite, Muu
- Tyyppi-sarake siirretty ennen Funktio-saraketta
- setSelectValue helper: lisää puuttuvan option automaattisesti muokatessa vanhaa dataa
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Uusi moduuli "Ohjeet" jossa ylläpitäjä voi kirjoittaa ohjeita
asiakaspalvelijoille miten asioita tehdään.
Ominaisuudet:
- Korttipohjainen listanäkymä (grid) hakutoiminnolla ja kategoriasuodatuksella
- Markdown-editori toolbarilla (B, I, H2, H3, listat, linkit, koodi, lainaukset)
- Esikatselu-toggle muokkausnäkymässä
- Artikkelien lukunäkymä renderoitulla Markdownilla
- Kategorioiden hallinta (lisää/poista)
- Tagit ja kiinnitys (pinned) -toiminto
- Oikeushallinta: kaikki lukevat, admin luo/muokkaa/poistaa
- Moduuli näkyy/piiloutuu yrityskohtaisista asetuksista
- Muutokset kirjautuvat muutoslokiin
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Tekniikka-tabin sijainnit-taulukosta muokkaus ohjaa nyt
oikeaan paikkaan asetuksissa ja scrollaa lomakkeeseen.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Sijainnit lisätään yrityksen asetuksista, joten tekniikka-
välilehden turhat Lisää sijainti -napit poistettu.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Kun subnet on merkitty varatuksi, vapaita lohkoja ei näytetä
sen sisällä — koko verkko on jo allokoitu.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
API palauttaa 409 kun VLAN-numero on jo olemassa, frontend
näyttää confirm-dialogin. Käyttäjä voi valita jatkaako vai ei.
IP/verkko-duplikaatti estää edelleen kokonaan (400).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Vapaa-rivin klikkaus avaa "Lisää verkko / IP" -lomakkeen,
jossa verkko-osoite on esitäytetty klikatulla vapaalla lohkolla
ja fokus siirtyy nimi-kenttään.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Duplikaatti-IP/verkko -tarkistus: estää saman verkko-osoitteen lisäämisen kahdesti
- Vapaan tilan näyttö: kun subnet avataan, näytetään vapaat osoitelohkot lasten välissä (vihreä "Vapaa"-rivi)
- Asiakas-kenttä poistettu IPAM-näkymästä (taulukot, lomake, haku)
- Varattu oletustilaksi verkkoa/VLANia lisättäessä
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Auto-VLAN saa subnetin/IP:n nimen (ei enää geneeristä 'VLAN X')
- Poistettu 'Reserved' tila-vaihtoehto lomakkeesta (Varattu riittää)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- parseNetwork() ja isSubnetOf() tukevat nyt IPv4 ja IPv6 (BigInt)
- IPv6 verkot (esim. 2001:db8::/32) sijoittuvat puuhierarkiaan
- Subnetin kohdalla näytetään käyttöaste: esim. "3/256" kertoo
kuinka monta alisubnettia on käytössä vs kapasiteetti
- Ei-parsittavat osoitteet näytetään puun juuressa
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Kun tallennetaan subnet tai IP jossa on VLAN-numero, tarkistetaan
löytyykö kyseinen VLAN jo listalta. Jos ei, luodaan se automaattisesti
VLAN-luetteloon.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Dropdown oli liian rajoittava — nyt VLAN-numeron voi kirjoittaa
vapaasti lomakkeeseen verkkojen ja IP:iden kohdalla.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
URL-hash tallentaa nyt sub-tabin: #tekniikka/ipam, #tekniikka/sites
jne. Refreshatessa palataan samalle sub-tabille.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Kun laitteelle tallennetaan hallintaosoite (IP), IPAM:iin luodaan
automaattisesti varattu IP-merkintä laitteen nimellä ja sijainnilla.
Jos IP on jo IPAM:issa, päivitetään se varatuksi laitteelle.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- VLAN-kenttä on nyt dropdown joka populoidaan VLAN-listasta
(subnetit viittaavat VLANeihin)
- Asiakas-kenttä on dropdown joka populoidaan asiakaslistasta
- Verkkonäkymässä VLAN-sarakkeessa näkyy numero + nimi viitteenä
- VLAN-osio näkyy aina (myös tyhjänä)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Subnetit ja IP:t näytetään hierarkkisena puuna jossa pienemmät
verkot menevät isomman sisään (esim. /24 → /16 → /8)
- Expand/collapse klikkaamalla ▶/▼ ikonia
- Drill-down: poraudu verkon sisään → -nuolella, breadcrumb ylhäällä
- VLANit erotettu omaksi luetteloksi verkkojen alapuolelle
- Omat "Lisää verkko/IP" ja "Lisää VLAN" -napit
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Vaihdettu ip2long() -> inet_pton() joka tukee sekä IPv4 että IPv6.
CIDR-alueet toimivat molemmilla (esim. 2001:db8::/32).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
X-Forwarded-For voi sisältää useita IP:tä pilkulla erotettuna.
Otetaan nyt vain ensimmäinen (asiakkaan oikea IP). Lisäksi
näytetään havaittu IP virheviestissä debuggausta varten.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Lisätty allowed_ips kenttä yrityksiin. Tyhjä = ei rajoitusta,
muuten vain listatut IP:t/CIDR-alueet pääsevät kirjautumaan.
Superadmin ohittaa aina IP-tarkistuksen (backdoor).
Tarkistus tehdään login, check_auth ja company_switch -endpointeissa.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Vaihdettu sarakkeen nimi 'Osoitettu' -> 'Agentti' ja
detail-näkymän dropdown 'Ei osoitettu' -> 'Ei agenttia'.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Siirretty Asiakas-sarake heti Tila-sarakkeen jälkeen ja lisätty
uusi Osoitettu (assigned_to) -sarake viimeiseksi sarakkeeksi.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Ratkaistu ja suljettu olivat käytännössä sama asia. Nyt vain:
Uusi → Käsittelyssä → Odottaa vastausta → Suljettu.
Vanhat ratkaistu-tiketit näkyvät edelleen (CSS jätetty).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Määräaikaisuuden päätyttyä sopimus jatkuu toistaiseksi voimassa
olevana, joten näytetään "(jatkuva)" vihreällä punaisella
"(päättynyt)" sijaan.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Hinnat:
- Asiakastaulukon hinnat blurrattu oletuksena (privacy)
- Hinta/kk -otsikossa silmä-checkbox jolla saa hinnat näkyviin/piiloon
- Blur pätee myös asiakaskortin detail-näkymään
Sopimuskausi:
- Näyttää jäljellä olevan ajan sulkeissa: "36 kk (30 kk jäljellä)"
- Päättyneet sopimukset punaisella: "36 kk (päättynyt)"
- Aloituspäivä poistettu luettelonäkymästä (näkyy detail-kortissa)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Vastauspohjien hallinta kuuluu asiakaspalvelu-osioon, ei API-asetusten alle.
Poistettu tuplana ollut HTML-osio + siihen liittyvät JS-eventlistenerit.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Tikettinumero:
- Uudet tiketit saavat juoksevan numeron VVNKKNN-formaatissa
(vuosi+kuukausi sekoitettu sekvenssiin, esim. 2600301)
- Numero näkyy tikettilistassa ja detail-näkymässä (#-merkillä)
- Sähköpostin aihe muotoa "Tiketti #2600301: Alkuperäinen aihe"
- Vastaukset ketjuuntuvat automaattisesti
Autoreply:
- Postilaatikkokohtainen asetus: checkbox + viestisisältö
- Uusi tiketti lähettää automaattisen vastauksen asiakkaalle
- Autoreply näkyy tiketin viestiketjussa (⚡ Automaattinen vastaus)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Poista SMTP override-testikentät (ei tarpeen enää)
- Tallennus pitää lomakkeen auki + näyttää "Tallennettu" -ilmoituksen
- SMTP-kenttäjärjestys samaksi kuin IMAP: Palvelin → Portti → Tunnus → Salasana → Salaus
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Captcha: loadBranding() ensin, sitten captcha+auth, jotta sessio-cookie
on luotu ennen captcha-latausta (estää eri sessiot rinnakkaisilla kutsuilla).
SMTP-testi: lisää salasanavihje (3 ensimmäistä + 2 viimeistä merkkiä),
override-kentät joilla voi testata eri tunnuksilla suoraan ilman DB:tä.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Korvaa mailbox_debug-endpoint kattavalla smtp_test-endpointilla,
joka testaa yhteyden, TLS:n ja autentikoinnin vaihe vaiheelta.
"Testaa SMTP" -nappi lomakkeessa näyttää tulokset.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>