Sync hakee nyt vain tikettien metatiedot (status, aihe, ryhmä) —
ei enää satoja getArticles-kutsuja jokaiselle tiketille. Artikkelit
haetaan on-demand ticket_detail-endpointissa kun käyttäjä avaa
tiketin. Nopeuttaa synkkausta dramaattisesti.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Selain cachetti vanhan script.js:n aiheuttaen showClosed-virheen
vaikka korjaus oli jo palvelimella. Versioparametri pakottaa uuden
latauksen.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Auto-refresh hakee nyt vain viimeisen synkkauksen jälkeen muuttuneet
tiketit (updated_at + 5min marginaali). Artikkelit haetaan vain
uusille tai muuttuneille tiketeille. "Hae postit" -nappi tekee
edelleen full syncin (full=true). Nopeuttaa autopäivitystä merkittävästi.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1. Auto-refresh synkkaa Zammadin taustalla ennen tikettien latausta
(joka minuutti tms. käyttäjän asetuksen mukaan).
2. Tikettiin vastatessa oletuksena valittuna se postilaatikko johon
viesti alun perin tuli — korjattu string/number vertailu.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1. Hae postit -nappi ajaa nyt myös zammad_sync automaattisesti
sähköpostien haun jälkeen (ohitetaan hiljaa jos Zammad ei käytössä).
2. Kun suljettuun/ratkaistuun tikettiin tulee uusi viesti,
tiketti avautuu uudelleen "uusi"-tilaan (aiemmin "käsittelyssä").
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Zammad-ryhmät eivät näkyneet postilaatikoiden näkyvyydessä koska ne
haettiin tickets-globaalista joka on tyhjä ennen tiketti-tabin avaamista.
Lisätty ticket_zammad_groups API-endpoint joka hakee uniikit ryhmät
suoraan tietokannasta.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Aiheutti SyntaxError: Identifier 'showClosed' has already been declared,
joka kaatoi koko sivun (vain footer näkyi).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
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>