Tidrapportering från fältet.
Så får ni in timmarna från folk som inte sitter vid ett skrivbord. Varför papper och sms tappar tid, vad en telefon kan och inte kan intyga om var någon befann sig, vad som händer med en rapport utan täckning, och hur attesterade timmar blir något ni kan fakturera.
Varför papper och sms tappar timmar
Timmarna kommer som sms på söndagskvällen. Någon knappar in dem på måndagen. Ingen minns om det var tre timmar eller tre och en halv, och ingen kan visa var personen var när passet började.
Förlusten är inte oärlighet. Den är tre helt vardagliga saker:
Minnet avrundar nedåt. En dag som rekonstrueras på söndagen är en dag av jämna siffror. De tjugo minuterna medan kunden letade efter nyckeln, den andra vändan till grossisten, de fyrtio minuterna på ett jobb som var offererat till trettio — ingenting av det överlever fyra dagars minne, och allt av det var verkligt.
Papper når inte fram till fakturan. Materialet står på en lapp i bilen. Jobbet är klart, lappen ligger i en jacka, och fakturan väntar på att någon ska tyda handstilen. Det som inte går att läsa faktureras inte alls.
Det finns ingenting att peka på. När en kund ifrågasätter sex timmar är ett sms med ”6h tors” inget bevis. Det är ett påstående, gjort i efterhand, av den som får betalt för det.
Inget av det här löses genom att be folk vara noggrannare. Det löses genom att låta rapporten ske i samma ögonblick som arbetet, och genom att hålla isär vad telefonen observerade från vad personen påstod.
Tidrapportering som teamet faktiskt använder handlar om införandehalvan, som är den halva som avgör om något av det här fungerar.
Stämpling i det ögonblick knappen trycks
Ett pass börjar när någon trycker på en knapp. I samma sekund tillfrågas telefonen en gång om sin position, och avläsningen följer med posten.
Fyra beslut gör den avläsningen värd att ha.
Avläsningen tas vid trycket, inte när rapporten skickas. Att ta den när en köad rapport till slut når servern hade registrerat var bilen befann sig när den hittade täckning, vilket är en annan plats och en sämre lögn än ingen position alls.
Noggrannheten avrundas uppåt, aldrig nedåt. Telefonen anger hur många meter avläsningen är säker inom. Att påstå att den är bättre än så hade satt någon utanför ett staket de stod innanför.
Servern avgör, inte telefonen. Koordinaterna jämförs mot uppdragets arbetsadress på servern. En telefon som får avgöra sin egen dom är en telefon som går att förmå att döma annorlunda.
Saknad avläsning är okänt, inte utanför. Om uppdraget saknar arbetsadress, eller adressen saknar koordinater eller radie, eller telefonen inte gav något, registreras att ingen dom kunde fällas. Att skriva ”utanför staketet” hade lagt en anklagelse på raden på grundval av ett fält kontoret aldrig fyllde i. ”Ingen position” och ”förmodligen någon annanstans” är inte samma påstående.
Och stämplingen väntar aldrig på något av det. Nekad behörighet, en telefon inomhus, ett dött chip, platstjänster helt avstängda: varje fall landar i ingen position efter åtta sekunder, och passet börjar ändå. En app som vägrar starta någons dag på grund av en behörighetsfråga är en app de slutar öppna.
Automatisk GPS-stämpling finns inte i en iPhone-webbapp
Det här behöver sägas rakt ut, eftersom det säljs som en funktion på annat håll.
En webbapp installerad på hemskärmen i iOS kan inte läsa telefonens position när den inte ligger i förgrunden. Det finns ingen positionering i bakgrunden för webbappar i iOS. Det är en plattformsbegränsning, den gäller alla leverantörer lika, och ingen mängd utveckling går runt den. Alltså kan en app av det här slaget inte stämpla in någon automatiskt när de kommer fram till en adress. Inte långsamt, inte ungefärligt, inte alls.
Den som påstår annat beskriver en av tre saker: en nativ app från App Store, en funktion som bara fungerar på Android, eller en funktion som bara fungerar medan telefonen är upplåst med appen framme på skärmen — vilket inte är automatiskt, utan bara ett tryck man inte har fått höra talas om.
Det som levereras i stället täcker det mesta av värdet: positionen verifieras i det ögonblick knappen trycks, och servern jämför den mot uppdragets adress. Det ni förlorar är framkomsten ni inte markerade. Det ni behåller är en bedömning ni kan stå för, och en begränsning som sägs i säljprocessen i stället för att upptäckas i månad tre.
Fältappen är en webbapp som installeras på hemskärmen. Den fungerar offline. Den är inte en nativ app, och det är värt att veta före köpet snarare än efter.
Vad GPS-stämpling faktiskt klarar går igenom plattformsdetaljerna.
En kö som töms i den ordning saker hände
Fältarbete sker där nätet inte finns. En bil i ett garage, ett hus med metertjocka väggar, en sträcka motorväg. En app som svarar ”kunde inte ansluta” till någon som just avslutat ett jobb lär dem att skriva dagen på ett papper i stället.
Därför skickas ingenting direkt. Allt som rapporterar ett faktum i stället för att ställa en fråga skrivs först till en kö i telefonen, skickas när det finns uppkoppling, och tas bort först när servern har kvitterat det.
Skrivet före skickat, alltid — även med perfekt täckning. Att skicka först och köa vid fel lämnar ett fönster: anropet är i luften, appen dödas, arbetet är borta. Det fönstret öppnas precis när nätet är dåligt, vilket är precis när fältarbete sker. Att skriva först kostar några millisekunder och stänger det.
Kön töms serieordnat, äldst först. Posterna är inte oberoende. En utstämpling stänger instämplingen före sig. Att skicka dem parallellt hade varit snabbare och hade kommit fram i fel ordning tillräckligt ofta för att spela roll.
Den stannar vid första felet som är värt att försöka igen, i stället för att hoppa förbi det. Det som gick fel är nästan alltid uppkopplingen, och att leverera senare arbete medan det som det hänger på ligger kvar i kön är precis så en utstämpling hamnar före sin instämpling.
Tre svar betyder att posten är färdigbehandlad. En 409 på en instämpling betyder att servern redan har den — anropet kom fram och svaret försvann, vilket är exakt vad en skakig uppkoppling gör. En 422 är en post servern vägrar en gång och kommer att vägra varje gång. En 404 pekar på ett uppdrag som är borta. Ingen av de tre blir bättre av att skickas igen, och att försöka i evighet hade låst kön bakom en post som aldrig kan lyckas. Allt annat — en tidsgräns, ett serverfel, inget nät alls — är värt ett nytt försök.
Kön ligger i IndexedDB snarare än i enkel webblagring, eftersom den är dimensionerad för att foton ska kunna passera genom den och en handfull sådana överskrider vad ett stränglager rymmer. Schemaläggning i en webbapp offline tar samma maskineri från planeringssidan.
Påståendet och bevisningen, åtskilda
En rapporterad timme blir två dokument som läses av personer som inte var där: en faktura och ett underlag för lön. Därför håller raden tre olika saker och blandar inte ihop dem.
Vad den anställde rapporterade — starten, slutet, rasten.
Vad telefonen sa — koordinater, den noggrannhet telefonen själv angav, och om avläsningen kom från satellit över huvud taget eller knappades in. En post som skrivs in i efterhand av kontoret registreras som just det, eftersom en tidrapport som inte kan skilja en stämpling från en rättelse inte går att granska.
Vad vi drog för slutsats — om det var innanför staketet, eller att ingen dom kunde fällas.
Att bara spara slutsatsen hade lämnat en tvist utan något att granska om. Det är hela skälet till uppdelningen: tre månader senare besvaras ”var Anna på plats” genom att titta, inte genom att lita på ett ja eller nej.
Två mindre beslut håller på samma sätt. Postens minuter räknas när den stängs och skrivs ned, aldrig om vid läsning — en attesterad tidrapport som ändrar sig för att en avrundningsregel skrevs om efteråt är en ingen kan försvara. Och när en post attesteras kopieras timpriset in på den där och då, i stället för att hämtas från personalkortet senare. En löneförhöjning i juni får inte skriva om vad mars kostade.
Något annat kön ger på köpet: varje post märks med ett id och en tidpunkt på enheten i det ögonblick handlingen sker, och det är den märkningen som ordnar kön. En dag rapporterad från tre källare kommer fram i den ordning den levdes, inte i den ordning täckningen kom tillbaka.
Attest som flöde, inte som flaskhals
En timme som når en faktura har godkänts av någon annan än den som rapporterade den. Det är hela poängen med atteststeget, och det är därför attestering är en egen behörighet som en fältmontör inte har.
Så här ser det ut:
En post stängs som inrapporterad, inte attesterad. Montören är klar; någon annan avgör om timmarna står sig.
En vecka skrivs under i ett svep. Attesten tar en lista med poster, inte en i taget, eftersom den verkliga handlingen är en chef som går igenom fredagseftermiddagen med avvikelserna överst.
Retur är det som gör en rättelse möjlig. En post skickas tillbaka med en skriven orsak, orsaken blir kvar på raden, och posten blir redigerbar igen för den som rapporterade den. Ingenting ändras i tysthet.
En attesterad post går inte att ändra eller ta bort. Den är del av en körning någon annan har skrivit under. Att rätta den innebär att den först returneras, vilket lämnar ett spår av varför siffran ändrades.
Flaskhalsen folk faktiskt klagar på är inte godkännandet. Det är jagandet: timmar som aldrig kommer in, så att fakturan väntar. Två saker hjälper mer än en snabbare attestvy. Timmar som rapporteras i arbetets ögonblick behöver inte jagas alls. Och där timmar fortfarande saknas står det utskrivet på fakturaunderlaget i stället för att tyst utelämnas, så att kontoret vet vad det väntar på innan det skickar något.
Attestera tid utan flaskhals handlar om att köra det här varje vecka utan att det blir någons fredag.
Övertid och OB: vad som räknas och vad som inte gör det
Var försiktig här, för det är på det här området schemaprogram oftast översäljs.
Det som finns. Rapporterad tid bär en sort: vanligt arbete, restid eller övertid. Den som rapporterar väljer, eller kontoret sätter det i efterhand. Sorten följer timmen hela vägen: på fakturaunderlaget och i exporten står en övertidstimme som övertid och en restimme som restid, och restid bär aldrig ROT- eller RUT-avdrag. Anställningsform registreras per person — anställd, timanställd, underentreprenör — eftersom en löneexport måste veta.
Det som inte finns. Ingenting räknar fram ett OB-tillägg. Ingenting läser ert kollektivavtal. Ingenting avgör att en timme var övertid på grund av när den låg, lägger på en procentsats för att det var söndag, eller kontrollerar dygnsvila. Det finns ingen regelmotor för något av det, på någon nivå.
Det är en medveten gräns snarare än en halvfärdig funktion. Ett OB-tillägg beror på vilket avtal som gäller för personen, vilken paragraf det lokala avtalet har ändrat och hur veckan räknas — och att få det 95 procent rätt är sämre än att inte göra det alls, eftersom de 5 procenten är osynliga tills någons fackliga företrädare hittar dem.
Alltså: timmarna, deras sort, vem som attesterade dem och när är registrerat och exporterbart. Lönen räknas i ett lönesystem. I dag går exporten härifrån som CSV; en direkt lönefil är planerad till 2026 och är inte levererad.
Från attesterade timmar till något ni kan fakturera
Ett avslutat uppdrag blir ett underlag: vad det är värt, formulerat så att någon annan kan fakturera det. Det måste gå att argumentera för på egen hand, eftersom det läses av ett kontor som inte var där och av en kund som bestrider det.
Tre regler håller uppe alltihop.
Bara attesterad tid är fakturerbar. Atteststeget är det enda som står mellan ”jag jobbade nio timmar” och en faktura. Timmar ingen skrivit under dyker aldrig upp bland dem som är det.
Arbete och material ligger alltid på skilda rader. Ett ROT- eller RUT-avdrag rör det ena och aldrig det andra, så de kan inte dela rad.
Ingenting avrundas två gånger. Varje rad avrundas en gång och summorna är summor av avrundade rader, vilket är vad fakturan som skrivs ur dem kommer att göra. Ett underlag som är en öre oense med sina egna rader är ett ingen litar på två gånger.
Timmarna grupperas som en faktura läser dem: en rad per person, per sorts tid, per pris. ”Anna Svensson, 14 timmar” är något en kund kan kontrollera; fjorton stämplingar är det inte. Två personer på ett uppdrag är två priser, och det är en person vars pris ändrades mellan två attester också, så priset är en del av det som gör en rad till en rad.
Det som inte faktureras visas ändå. Tid markerad som ej fakturerbar, eller timmar på ett uppdrag med fast pris där det avtalade priset är det som debiteras, följer med som nollrader med angiven orsak i stället för att strykas — så att timmarna på underlaget fortfarande summerar till timmarna på tidrapporten.
Och underlaget säger vad det inte vet, med namn: tid som väntar på attest, ett uppdrag som inte är avslutat och vars underlag därför kommer att ändras, ett uppdrag som redan är fakturerat, timmar utan pris som därför faktureras till noll. Att namnge dem är skillnaden mellan en faktura som är en dag för kort och ett samtal ni hann ta innan ni skickade den.
Hela månaden exporteras som CSV skriven för svenskt Excel — byteordningsmärke, semikolon, decimalkomma — vilket är skillnaden mellan en fil en redovisningskonsult använder och en de mejlar tillbaka. Kör ni även faktureringsmodulen blir underlaget fakturarader utan att någon skriver av något.
Läs fördjupningarna
- Tidrapportering
Tidrapportering som laget faktiskt använder
Timmarna kommer som ett sms på söndag kväll och någon skriver av dem på måndag. Det här måste vara sant om ett tidrapporteringssystem innan ett lag använder det utan att jagas.
- Tidrapportering
GPS-stämpling: vad som faktiskt är möjligt
Automatisk stämpling när bilen kommer fram säljs ständigt och går inte att bygga i en webbapp på iOS. Här är vad som verkligen går, och varför "ingen läsning" aldrig får sparas som "utanför".
- Tidrapportering
Attestera tid utan att bli flaskhalsen
Attesten finns för att timmarna på en faktura ska ha godkänts av någon annan än den som rapporterade dem. Så här kör ni den veckovis på tjugo minuter i stället för månadsvis på en dag.
Vanliga frågor
Stämplar appen in personalen automatiskt när de kommer fram?
Nej, och vi tänker inte påstå det. En webbapp på iOS får ingen position i bakgrunden, så automatisk stämpling går helt enkelt inte att bygga där — det gäller alla, inte bara oss. Det vi gör i stället är att hämta positionen i den sekund montören trycker på knappen och låta servern jämföra den mot uppdragets adress. Saknas läsning sparas det som okänt, aldrig som utanför staketet.
Vad händer med timmar som rapporteras utan täckning?
De skrivs till en kö i telefonen innan något skickas, även när signalen är god. Kön töms i den ordning sakerna faktiskt hände och stannar vid första riktiga felet i stället för att hoppa förbi det — en utstämpling hänger på instämplingen före den. Varje post märks på enheten i handlingens ögonblick, så en dag rapporterad från tre källare kommer fram i den ordning den levdes.
Kan någon ändra sina timmar efter att de attesterats?
Nej. En attesterad post måste först returneras, med en skriven orsak som blir kvar på raden, innan den kan ändras eller tas bort. Det är det som gör rättelsen synlig i stället för tyst. Attest är en egen behörighet, och en fältmontör har den inte.
Räknar det ut OB och övertidstillägg?
Nej. Övertid är en sorts tid någon rapporterar, och den är märkt som övertid hela vägen till fakturaunderlaget och exporten. Ingenting härleder den ur när timmen låg, lägger på en procentsats, läser ert kollektivavtal eller kontrollerar dygnsvila. Det är en löneberäkning och den stannar i ert lönesystem.
Vad får kontoret i slutet av veckan?
Ett fakturaunderlag per uppdrag: attesterade timmar grupperade per person och per sorts tid, material på egna rader, fasta priser, restid som restidsrad, och ROT- eller RUT-avdraget enbart över arbetet. Ofakturerat arbete följer med som nollrader med angiven orsak i stället för att strykas, och varningarna har namn — väntar på attest, ej avslutat, redan fakturerat, timmar utan pris.
Får vi ut en lönefil ur det här?
CSV i dag, skriven så att svenskt Excel öppnar den rätt i stället för att lägga varje rad i en enda kolumn. En direkt lönefil är planerad till 2026 och finns inte i produkten nu. Det som finns i produkten nu är underlaget bakom den: vem som rapporterade vad, vad deras telefon sa vid tillfället, vem som attesterade och när.
Se fältappen på en riktig telefon
Tjugo minuter. Stämpla in, beta av checklistan, tappa täckningen med flit och se kön tömmas. Bokning & schema från 449 kr i månaden, 14 dagars prova-på.