Android-sovellus

Työtori

Viiden työpaikkalähteen ilmoitukset yhtenä listana, hakuajasta hakemukseen asti

Julkaistu Google Playssa

Työtori kokoaa avoimet työpaikat viidestä suomalaisesta lähteestä yhdeksi vertailtavaksi listaksi ja vie käyttäjän ilmoituksesta hakemusluonnokseen, liitteisiin ja hakemuksen merkitsemiseen lähetetyksi. Työn vaikein osa ei ollut käyttöliittymä vaan se, että jokainen lähde palauttaa datan omalla tavallaan. Toteutin sekä Compose-sovelluksen että FastAPI-taustajärjestelmän, joka yhtenäistää lähteet samaan muotoon.

Tuote

Työnhaussa toistuu sama urakka: samat ilmoitukset luetaan useasta palvelusta, hakuajat unohtuvat ja hakemusteksti aloitetaan joka kerta tyhjältä sivulta. Työtori tekee tästä yhden polun: haku, ilmoitus, luonnos, liitteet ja merkintä lähetetyksi samassa sovelluksessa.

Kenelle

Suomessa työtä hakeville, myös niille joille sovellukset eivät ole arkipäivää. Tuotevaatimuksena oli suomi ensin, vähän kerrallaan näytöllä, isot kosketuskohteet ja tuki suurille fonttikoille.

Mitä se ratkaisee

Työpaikkalähteet ovat erillisiä ja erimuotoisia. Työtori hakee ne yhdellä haulla, näyttää jokaisen ilmoituksen samoilla kentillä ja pitää hakuajan mukana ilmoituksesta hakemukseen ja hakemusten seurantaan asti.

Miten sitä käytetään

Käyttäjä täyttää profiilin ja CV:n, hakee valitsemistaan lähteistä tai lisää ilmoituksen omalla linkillä, tallentaa kiinnostavat työpaikat ja valmistelee hakemuksen. Hakemuksen lähettää aina käyttäjä itse.

Keskeiset ominaisuudet

Työpaikkojen haku

  • Hakusanat profiilista tai käyttäjän itse kirjoittamina
  • Yksi tai useampi sijainti, koko maa tai etätyö
  • Lähteiden valinta, lajittelu ja ehdokkaan piilotus

Ilmoituksen tiedot

  • Nimike, työnantaja, sijainti, lähde ja hakuajan päättyminen
  • Käyttäjän avaama esikatselu ilmoituksen kuvauksesta
  • Ilmoituksen voi lisätä myös linkillä tai liittämällä tekstin

Sopivuusarvio

  • Yksi deterministinen prosentti, taso ja lyhyt perustelu
  • Sama luku hakutuloksessa ja työpaikan tiedoissa
  • Arvio on Työtorin oma; työnantaja ei näe sitä

Hakemusluonnos

  • Hakemusteksti ja saateviesti profiilista, CV:stä ja ilmoituksesta
  • Luonnos on muokattava, ja asiakirjan kieli valitaan erikseen
  • Hakemuskirje vietävissä PDF-muotoon

CV ja liitteet

  • Ladattu PDF-CV tai käsin kirjoitettu CV
  • Käsin kirjoitetusta CV:stä muodostetaan PDF, jonka käyttäjä hyväksyy
  • Liitteiden valmistelu sähköpostiin ja tallennus puhelimeen

Työnhakuvelvoite

  • Tarkastelujakson alku- ja loppupäivä sekä vaadittu hakemusmäärä
  • Edistyminen lasketaan lähetetyksi merkityistä hakemuksista
  • Kesken olevat luonnokset, lähetetyt ja arkisto omina tiloinaan

Lähteet ja datan yhtenäistäminen

Viisi lähdettä tarjoaa datansa kolmella eri tavalla: julkisena hakurajapintana, RSS/XML-syötteenä ja HTML-sivuina. Jokaisella on oma adapterinsa, mutta ne kirjoittavat samaan kandidaattimalliin, jotta sovellus näkee vain yhdenlaisia ilmoituksia.

Lähdekohtaiset adapterit

Yksi lähde luetaan JSON-hakurajapinnasta, toinen RSS/XML-syötteestä ja kolmas kortti-HTML:stä. Syöte on vakaampi sopimus kuin sivun rakenne, joten se on aina ensisijainen. Uutta lähdettä ei oteta käyttöön ennen auditointia.

Hakusanojen yhteinen semantiikka

Termit normalisoidaan yhdessä paikassa ennen lähdekohtaista hakusuunnitelmaa: erotinmerkit, välilyönnit, kirjainkoosta riippumaton deduplikointi ja yhteinen yläraja. Sama hakusana tarkoittaa siis jokaisessa lähteessä samaa.

Deduplikointi

Sama työpaikka löytyy usein monesta lähteestä ja monella hakusanalla. Kaksoiskappaleet karsitaan vakaalla avaimella: ensin lähteen oma tunniste, sitten osoitteessa oleva työavain ja viimeisenä kanoninen linkki – sekä lähteen sisällä että lähteiden välillä.

Hakuaika päästä päähän

Hakuaika luetaan sieltä mistä lähde sen antaa, sanitoidaan yhteen muotoon ennen tallennusta ja kulkee samana arvona hakutuloskorttiin, työpaikan tietoihin ja hakemusluonnokseen. Käyttäjä ei tulkitse viittä päivämäärämuotoa.

Virheiden eristys ja rajat

Yhden hakusanan tai lähteen virhe ei kaada muita: lähde saa hallitun virhetilan ja muiden tulokset palautetaan normaalisti. Hakusuunnitelmalla on kiinteä pyyntöyläraja lähdettä kohti.

Työtori lukee vain julkisia hakusivuja ja syötteitä. Se ei luo käyttäjälle tiliä lähdepalveluihin eikä hae työpaikkaa niiden kautta.

Tekninen toteutus

Kokonaisuus on Android-sovellus, oma rajapintapalvelu ja tietokanta. Käyttöoikeudet, hakulogiikka ja mallikutsut ovat tarkoituksella palvelinpuolella, koska sovellus ei voi olla niiden turvaraja.

Android-sovellus

Kotlin · Jetpack Compose · Material 3 · Navigation Compose · DataStore · Retrofit / OkHttp / Moshi

  • MVVM- ja repository-rakenne sekä deterministinen tilamapperi näkymille
  • Tuki Android 8:sta (API 26) alkaen, käännetty API 36:ta vasten
  • Tallennettu työpaikka, luonnos, lähetetty ja arkisto ovat yksi selkeä elinkaari
  • Saavutettavuus mitoitettiin suurille fonttikoille: kortit rivittyvät, tila kerrotaan tekstinä eikä värillä

Kolme kieltä, neljä eri kielikäsitettä

AppCompat per-app locale · string- ja plural-resurssit · resurssitestit

  • Käyttöliittymä suomeksi, ruotsiksi ja englanniksi; kielivalinta on sovelluskohtainen
  • Käyttöliittymän kieli, hakemusasiakirjan kieli, analyysivastausten kieli ja työnantajan oma sisältö pidetään erillään toisistaan
  • Pitkäikäiseen tilaan ei tallenneta valmiiksi käännettyä tekstiä vaan viestikoodeja
  • Avainpariteetti, pluralit ja placeholderit tarkistetaan testeillä; kovakoodatut tekstit estetään regressiotestillä

Backend ja tietokanta

FastAPI · Python · Pydantic · SQLAlchemy · Alembic · MariaDB

  • Rajapinnat profiilille, CV:lle, haulle, tallennetuille työpaikoille, luonnoksille ja käyttöoikeuksille
  • Lähdekohtaiset hakuadapterit yhteisen kandidaattimallin takana
  • Versioidut Alembic-migraatiot ja yksi kanoninen skeema
  • Strukturoitu virhesopimus vakailla koodeilla, jotka sovellus kääntää käyttäjän kielelle itse

Deterministinen logiikka ja tekoälyn rajattu rooli

Deterministinen pisteytys · neljä rajattua mallikutsua · sääntöpohjainen analyysi

  • Sopivuusarvion prosentti lasketaan deterministisesti; malli ei tuota rinnakkaista lukua
  • Backend tekee mallikutsun vain neljässä kohdassa: hakemusluonnos, sopivuuden perustelu, hakutulosten selitys ja lomakeavun vastaukset
  • Hakuohjeiden analyysi on sääntöpohjainen eikä käytä mallia lainkaan
  • Jos mallipalvelu ei vastaa, haku palauttaa silti tulokset ja pisteet

Tunnistautuminen, käyttöoikeudet ja maksut

Firebase Authentication · Firebase App Check · Google Play Integrity · Google Play Billing

  • Kirjautuminen sähköpostilla tai Google-tilillä; sovellus vaatii käyttäjätilin
  • Suojatut pyynnöt kuljettavat varmennetun Firebase ID -tokenin, ja App Check -token tarkistetaan backendissä omalla policy-kerroksella
  • Backend varmentaa Play-ostot ja omistaa Työtori+ -käyttöoikeuden; sovellus ei myönnä sitä itse
  • Ilmaisversion hakukiintiö ja tallennusraja varataan ja tarkistetaan atomisesti palvelimella

Ympäristöt, laatu ja julkaisu

Gradle product flavors · Firebase Crashlytics · Play In-App Updates · Linux-palvelinympäristö

  • Kehitys- ja tuotantobackend erotetaan Gradlen flavor-tasolla; debug-buildia ei voi kääntää tuotantoa vasten
  • Sovelluksen mukana toimitettava avoimen lähdekoodin lisenssilista muodostetaan buildissa variantin todellisesta riippuvuuspuusta
  • Suojatut käyttöpolut on kirjattu regressiolistaksi ja varmennettu fyysisellä laitteella ennen julkaisua
  • Julkaisu tehdään allekirjoitettuna Android App Bundlena Google Play -tuotantoon

Tietoturva ja tietosuoja

Työtori käsittelee CV:tä, hakemustekstiä ja työnantajan lomakkeita, joten rajat piti päättää ennen toteutusta eikä sen jälkeen. Ne on kirjattu tuotesopimukseksi ja suojattu regressiotesteillä.

Tili vaaditaan

Kirjautuminen tapahtuu sähköpostilla tai Google-tilillä. Profiili, CV, haut, tallennetut työpaikat ja hakemukset sijaitsevat Työtorin omassa taustajärjestelmässä, joten sovellus ei ole paikallinen eikä toimi ilman verkkoa.

Sisäinen selain

Työnantajan oma hakulomake avataan sovelluksen sisällä, ja käyttäjä navigoi siinä itse. Lomakeapu lukee vain näkyvän lomakkeen rakenteen: ei kirjoitettuja arvoja, salasanoja, piilokenttiä, evästeitä, selaintallennusta, HTML:ää eikä koko sivun tekstiä.

Ei automaattista täyttöä eikä lähettämistä

Perustietojen täyttö käynnistyy vain käyttäjän aloitteesta ja vahvistuksella, ja se koskee rajattua joukkoa kenttiä. Valintoja, valintaruutuja tai liitteitä ei valita käyttäjän puolesta, eikä lomaketta lähetetä koskaan automaattisesti.

Mitä tekoälylle välitetään

Neljässä toiminnossa profiilin, CV:n, ilmoituksen tai lomakkeen kysymysten tekstiä välitetään ulkopuoliselle tekstin generointipalvelulle käsittelijänä. Tämä kerrotaan suoraan sen sijaan, että väitettäisiin datan pysyvän aina omassa järjestelmässä.

Telemetria

Käyttötilastot voi kytkeä pois asetuksista. Kaatumisraportointi on eri asia eikä kuulu saman kytkimen alle, ja se kerrotaan käyttäjälle. Telemetriaan ei viedä sähköpostia, tunnisteita, hakusanoja, työnantajaa, CV:tä eikä hakemustekstiä.

Tili ja omat tiedot

Tilin ja tietojen poisto onnistuu suoraan sovelluksesta. Tilaus ei ole edellytys tietosuoja-asetuksille, uloskirjautumiselle, poistolle eikä omien tietojen lukemiselle. Sovellus ei käytä mainostunnistetta eikä pyydä sijaintilupaa.

Kuvakaappaukset

Kuvat ovat sovelluksen Google Play -kuvakaappauksia suomenkielisestä käyttöliittymästä. Klikkaamalla kuva avautuu täysikokoisena.

Työtorin työpaikkalähteiden valinta: Duunitori, Jobly, Työmarkkinatori, Kuntarekry ja Valtiolle.fi.
Lähteiden valinta: käyttäjä päättää mitkä viidestä lähteestä ovat haussa mukana. Työtori+ -merkintä kertoo, mitkä lähteet vaativat tilauksen.
Työtorin hakutulos, jossa näkyvät nimike, lähde, sijainti, hakuajan päättyminen ja sopivuusarvio.
Hakutulos: jokainen ilmoitus näytetään samoilla kentillä lähteestä riippumatta, ja sopivuusarvio tulee deterministisestä pisteytyksestä perusteluineen.
Lomakeapu Työtorin sisäisessä selaimessa: tunnistetut työnantajan lomakkeen kentät ja vahvistusta vaativa täyttötoiminto.
Lomakeapu: työnantajan oma lomake selaimessa ja sen tunnistetut kentät. Täyttö on käyttäjän käynnistämä toiminto, ei automatiikkaa.

Julkaisutilanne

Työtori on julkaistu Google Playhin paketilla com.janstech.tyotori ja vaatii käyttäjätilin. Profiili, CV, Työmarkkinatori-haku, hakemusten seuranta ja työnhakuvelvoitteen laskuri toimivat ilman tilausta. Työtori+ avaa loput neljä hakulähdettä ja jatkuvan tekoälyavun. Rajat ovat backend-konfiguraatiota, ja käyttöoikeuden varmentaa aina palvelin.