Normaalisti näytetään vain "X avointa tikettiä". Suljettujen määrä
tulee näkyviin suluissa vasta kun käyttäjä ruksaa Suljetut-checkboxin.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Avoimet/uudet/käsittelemättä-palkki ja sivukoon valitsin näkyvät nyt
tikettitaulukon yläpuolella eikä alapuolella.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Sivukoon valinta (25/50/100/250) toimii nyt - muuttaa TICKETS_PER_PAGE ja
renderöi tikettilistan uudelleen ensimmäiseltä sivulta.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Paginointi: 100 tikettiä/sivu, navigointipalkki sivujen välillä
- Filtterit resetoivat sivunumeron 1:ksi
- Select All valitsee vain nykyisen sivun tiketit
- Zammad-synkronointi tallentaa source=zammad ja zammad_group
- Postilaatikoiden näkyvyysasetuksissa Zammad-ryhmät (Zammad)-merkinnällä
- Zammad-ryhmien piilotus filtteröi tiketit samalla tavalla kuin postilaatikot
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Luotu Noxus SVG-logo (violetti heksagoni + N)
- Demo-yritys nimetty uudelleen Noxukseksi violetilla värillä
- API-tabi piilotettuna ellei yrityksellä ole integraatioita päällä
(superadmin näkee aina)
- check_auth palauttaa has_integrations-lipun
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Kun Zammad-URL syötettiin ilman protokollaa (esim. desk.web1.fi),
cURL ei osannut muodostaa oikeaa osoitetta ja synkronointi epäonnistui.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Superadmin-käyttäjällä oli user_companies-taulussa vain yksi yritys,
joten hän ei voinut vaihtaa tai muokata muita yrityksiä (esim. intra.web1.fi).
Nyt superadmin saa kaikki yritykset sessioon loginissa ja check_auth:ssa,
ja requireCompany() + company_switch ohittavat company-tarkistuksen.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
_dbFetchRow-funktiota ei ole olemassa, oikea nimi on _dbFetchOne.
Tämä aiheutti Fatal errorin kaikissa integraatio-operaatioissa,
minkä vuoksi integraatiot eivät tallentuneet tietokantaan.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Aiemmin loadCaptcha() ja checkAuth() kutsuttiin rinnakkain ilman awaitia,
jolloin ensimmäisellä kerralla (ei PHPSESSID-cookieta) kumpikin loi oman
sessionin. Captcha-vastaus tallentui eri sessioon kuin login-kutsu käytti.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Saatavuus-API kortti (API-avain, CORS, ohjeet) näkyy aina API-tabissa
- Telegram ja Zammad kortit näkyvät vain kun integraatio on päällä
- Korjattu puuttuva </div> Telegram-kortista (rikkoi Zammad-kortin sisäkkäisyyden)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Kaikki integraatio/zammad-endpointit kutsuivat requireCompany() ilman
return-arvon talteenottoa, jolloin $companyId oli null ja aiheutti
Fatal error. Korjattu: integrations, integration_save, integration_test,
zammad_groups, zammad_sync, zammad_reply.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Yritykset-tab: integraatio-checkboxit tallentavat vain enabled-tilan
- API-tab: Zammad/Saatavuus/Telegram kortit näkyvät kun integraatio päällä
- Zammad-asetukset (URL, token, ryhmät, synkronointi) kokonaan API-tabissa
- integration_save: tyhjä config ei ylikirjoita olemassaolevia asetuksia
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Integraatiot erillinen table-card yrityksen asetuksissa (vain superadmin)
- Zammad-konfiguraatio (URL, token, ryhmät, synkronointi) siirretty API-tabiin
- Saatavuus-API, Telegram ja Zammad kortit näkyvät API-tabissa kun integraatio on enabloitu
- Korjattu integration_save ja integration_test: puuttuva $input json_decode
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Moduulit, integraatiot ja IP-rajoitukset piilotetaan yritysadminilta (vain superadmin näkee)
- Saatavuus-API ja Telegram checkboxit tallentavat tilan heti muutoksessa
- session_regenerate_id(false) estää race conditionin kirjautumisen jälkeen
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- loadCompanyIntegrations() asettaa kaikkien checkboxien tilan
- Saatavuus-API ja Telegram checkboxit tallentavat tilan heti muutoksessa
- API-sivun kortit näkyvät/piiloutuvat integraatiotilan mukaan
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Login: jos kaikki käyttäjän yritykset IP-estetty → estä
kirjautuminen kokonaan. Valitsee automaattisesti ei-estetyn
yrityksen aktiiviseksi.
- check_auth: jos aktiivinen yritys IP-estetty → vaihda
sallittuun. Jos kaikki estetty → kirjaa ulos.
- company_update: vain superadmin saa muuttaa allowed_ips-kenttää.
Estää adminia poistamasta IP-rajoitusta itseltään.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Admin poistaa käyttäjän vain nykyisestä yrityksestä (user_companies).
Käyttäjä poistetaan kokonaan vasta kun ei kuulu enää yhteenkään
yritykseen. Superadmin poistaa edelleen kokonaan.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Sääntöjen kenttänimet: DB käyttää type_set/status_set mutta
API lähetti set_type/set_status → nyt dbSaveTicketRule hyväksyy
molemmat ja matching lukee oikeat DB-kenttänimet
- Migraatio: täytä fetched_message_ids olemassaolevien tikettien
message_id:illä niin poistetut viestit eivät tule takaisin
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Tiketin avaaminen ja listaan palaaminen viittasivat vanhoihin
ticket-rules-view/ticket-templates-view/ticket-settings-view
elementteihin jotka poistettiin alinavi-muutoksessa.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Korjaa implode()-bugi: $email['to'] on string, ei array
- Lisää fetched_message_ids-taulu joka estää poistettujen
tikettien uudelleenluonnin seuraavassa haussa
- Viestit haetaan postilaatikosta vain kertaalleen
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
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>
- Drop zone dokumenttilistan alaosaan (raahaa tai klikkaa)
- Multi-file upload: luo dokumentit ja lataa tiedostot automaattisesti
- Edistymispalkki näyttää latauksen tilanteen
- Kansioiden raahaus: luo automaattisesti alikansio + tiedostot
- Kategoria-tunnistus tiedostopäätteen mukaan (kuva/muu)
- Multi-file input fallback perinteiselle tiedostovalinnalle
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Lisää Gateway-sarake ja -valitsin NetAdmin-näkymään (devices-linkitys)
- VLAN ja IP näytetään IPAM:sta automaattisesti asiakkaan nimellä
- Muokkausmodaalissa asiakkaan IPAM VLANit/IP:t näkyvät ensimmäisinä
- DB: gateway_device_id LEFT JOIN devices, IPAM-enrichment API:ssa
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Rooli-sarakkeessa näytetään nyt vain valitun yrityksen rooli
- Ei enää tuplabadgeja jos käyttäjä on admin useassa yrityksessä
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Odota loadDocuments() (joka lataa customers-listan) ennen openDocCustomerFolder()-kutsua
- Estää ID:n näkymisen nimen sijasta kun sivu ladataan hashilla
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Vanhat kansiot (customer_id = NULL) saavat customer_id:n dokumenttiensa perusteella
- Tyhjät/orvot kansiot poistetaan automaattisesti
- Migraatio on idempotenssi: ei tee mitään kun orphaneja ei ole
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Poistettu kokousmuistio-vaihtoehto kategoria-dropdownista
- Piilotetaan koko kategoria-kenttä kun luodaan/muokataan kokousmuistiota
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- loadDocuments() lataa nyt customers-listan jos se on tyhjä
- Kansionäkymä näyttää dokumenttien ja kokousmuistioiden määrät erikseen
- Korjaa tyhjä kansionäkymä kun Dokumentit-tab avataan ennen Asiakkaat-tabia
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Dokumentit-tab ei näytä kokousmuistioita (category !== kokousmuistio)
- Kokoukset-tab näyttää vain kokousmuistiot
- Poistettu kategoria-suodatin ja -sarake dokumenttilistasta
- Parannettu otsikot: näyttää asiakkaan nimen sub-tabin yhteydessä
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Lisää customer_id sarake document_folders-tauluun (ALTER TABLE migraatio)
- dbLoadFolders() tukee nyt customer_id suodatusta
- dbSaveFolder() tallentaa customer_id:n kansioon
- API document_folders endpoint vastaanottaa customer_id parametrin
- JS: kansiot ladataan ja luodaan asiakaskohtaisesti (currentDocCustomerId)
- Jokaisen asiakkaan kansiorakenne on nyt itsenäinen
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Ohjeet → Asiakaspalvelu-tabin alle sub-tabiksi
- Laitetilat → Tekniikka-tabin alle sub-tabiksi
- Arkisto → Asiakkaat-tabin alle sub-tabiksi
- Päivitä hash-reititys ja vanhojen linkkien yhteensopivuus
- Lisää switchSupportSubTab() ja switchCustomerSubTab()
- Siivoa debug-logitukset laitetila-poistosta
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Ongelma: migraatio ajautui joka API-kutsulla ja kopioi sites-taulun
rivit takaisin laitetilat-tauluun, joten poistettua laitetilaa ei
voinut oikeasti poistaa — se ilmestyi aina takaisin.
Korjaus: DELETE FROM sites migraation jälkeen, ja tarkista ensin
onko sites-taulussa rivejä (vältetään turha ajaminen).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- dbDeleteLaitetila nollaa devices.laitetila_id, devices.site_id
ja ipam.site_id ennen laitetilan poistoa
- API: parempi virhekäsittely (\Throwable), logi, tyhjä ID tarkistus
- Tiedostojen poisto: @-suppression ja GLOB_BRACE hidden-tiedostoille
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
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>
- Korvattu select-dropdownit hakukentillä (searchable combobox)
- Kirjoittamalla suodattaa tuloksia nimellä, IP:llä, sijainnilla jne.
- Nuolinäppäimillä navigointi, Enter valitsee, Esc sulkee
- Vapaan tekstin syöttö mahdollista jos IPAM:sta ei löydy
- IP-kenttä tukee nyt myös verkkoja (subnet/prefix) IP-osoitteiden lisäksi
- Vapaat IP:t, varatut IP:t ja verkot ryhmitelty omiin osioihinsa
- Badge-värit: vihreä (vapaa), punainen (varattu), sininen (subnet)
- Sama hakukenttä-komponentti sekä netadmin-modalissa että asiakasformissa
- API palauttaa nyt subnetit IP-listan mukana
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Poisto-nappi (🗑) näkyy kansion päällä hover-tilassa
- Vahvistusikkuna ennen poistoa
- Kansion dokumentit ja alikansiot siirtyvät ylätasolle poistettaessa
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- NetAdmin liittymälomakkeen VLAN, Laite ja IP muutettu tekstikentistä dropdown-valikoiksi
- Asiakasformin liittymäkentät samoin muutettu dropdown-valikoiksi
- Dropdownit populoidaan IPAM:n VLANeista, IP-osoitteista ja Tekniikan laiterekisteristä
- IP-dropdown ryhmittelee vapaat ja varatut IP:t optgroupeilla
- Laite-dropdown näyttää ping-statuksen, hallintaosoitteen ja mallin
- VLAN-dropdown näyttää VLAN ID:n, nimen ja sijainnin
- Jos nykyinen arvo ei ole IPAM/laiterekisterissä, näytetään se (manuaalinen)-lisätekstillä
- IPAM-tilan automaattipäivitys: kun liittymälle asetetaan IP, IPAM merkitsee sen varatuksi
- Kun IP poistetaan tai vaihdetaan, vanha IP vapautetaan IPAM:ssa automaattisesti
- API palauttaa nyt vlans ja ips -listat netadmin_connections-endpointissa
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Poistettu Tiedostot-section, loadFiles-kutsu ja file-upload event listener
- Poistettu loadFiles() ja deleteFile() funktiot (formatFileSize jää käyttöön)
- Dokumentit-osio korvaa vanhan tiedostojärjestelmän versioituina dokumentteina
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Poisto-nappi näkyy dokumentin luojalle (ei enää vain admin)
- API: document_delete sallii poiston adminille tai luojalle
- Uusi max_versions-sarake documents-tauluun (oletus 10)
- Versioiden automaattinen pruning: uuden version tallennuksen yhteydessä
poistetaan vanhimmat versiot jos yli max_versions (tiedostot levyltä myös)
- Valittavissa per dokumentti: 5, 10, 20, 50 tai rajaton
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Uusi dokumenttityyppi "kokousmuistio" jolla inline tekstieditori (ei tiedostopohjainen)
- document_versions.content -sarake kokousmuistioiden tekstin tallennukseen
- Sub-tabit Dokumentit-välilehdelle (Kaikki / Kokoukset) Tekniikka-mallin mukaan
- Kansiorakenne: document_folders-taulu, kansionavigaatio breadcrumbsilla
- Uudet API-endpointit: document_folders, document_folder_save/delete, document_content_save, document_move
- Asiakasprofiilin Dokumentit-osio: näyttää linkitetyt dokumentit + pikanapit luontiin
- Asiakasprofiilista voi avata dokumentin suoraan tai luoda uuden linkitettynä asiakkaaseen
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>