← Alla projekt

Data · Backend · 2026

Synk av tidrapporter, rapportering och datapipeline

En plattform som synkar ett företags tidrapporter och rapporterar debiterbara timmar mot mål, senare ombyggd på en datapipeline som stämde med originalet post för post.

  1. 01KällsystemExternt tidrapporteringssystem där varje tidspost börjar.
  2. 02ConnectorSex strömmar; checkpoints gör att en fem timmar lång backfill kan återupptas.
  3. 03SQL-vyerAll transformering på ett ställe, ägd av pipelinen.
  4. 04AppLäser bara; dess databasroll saknar skrivrätt till pipelinens data.
  5. 05RapporterSpärrSidor, mejl, Excel och PDF från samma målmotor. Oklassificerade timmar stoppar utskicket.
Den ombyggda pipelinen. Varje lager har en ägare, och en rapport som kan vara fel skickas inte.
för en rutinsynk, tidigare en full hämtning på 2–4 timmar
~30 s
strömmar fick samma antal poster som källan
6 av 6
testtäckning med 1 170+ tester
97 %

Utgångsläge

Företaget registrerar tid i ett externt tidrapporteringssystem. Målen följer varje persons arbetskalender, helgdagar och ledighet, och en felaktig rapport är värre än ingen.

Min roll

Ensam utvecklare, även för ombyggnaden av pipelinen och dess uppsättning i Docker och Kubernetes.

Vad jag byggde

  • Arkitektur: En och samma målmotor matar sidor, mejl, Excel och PDF, så att siffrorna stämmer överallt. Ombyggnaden ger varje lager en ägare: Airbyte läser in, SQL-vyer transformerar, appen läser.
  • Frontend: Serverrenderade sidor som fungerar i mobilen; diagram jämför två valfria av de senaste 26 veckorna.
  • Backend: Inkrementell synk och schemalagda rapportflöden i Celery; mejl och PDF delar samma mall.
  • Data: En Python-connector med sex strömmar, vars checkpoints gör att en fem timmar lång backfill kan återupptas efter ett avbrott.
  • Säkerhet: Rollregler styr vad varje användare ser och skickar; PDF-renderaren hämtar bara paketerade resurser; appens databasroll saknar skrivrätt till pipelinens data.
  • Infrastruktur och DevOps: Docker rakt igenom; Airbyte på lokal Kubernetes, uppsatt med idempotenta skript.
  • Test: Över 1 170 tester går igenom med 97 % täckning; mutationstestning avslöjade två saknade tester.

Svåra problem och beslut

  • Hellre stopp än fel. Ett jobb håller låset från synk till sista mejlet, och oklassificerade timmar stoppar utskicket. Priset: en stoppad rapport skickas om för hand.
  • Tyst trunkering. När hämtningen slutade vid första tomma sidan föll två tredjedelar av fakturorna bort, medan körningen rapporterade att allt gått bra. Nu läser connectorn tills den har det totala antal som API:et anger, annars fallerar den.

Resultat

En rutinsynk tar runt 30 sekunder i stället för en full hämtning på 2–4 timmar. Ombyggnaden fick samma antal poster som källan i varje ström, och under en testvecka stämde varje befintlig post, med identiska timmar.

Teknik

Python, Django, PostgreSQL, Celery, Redis, WeasyPrint, Airbyte, Convex, Docker, pytest, mutmut

Områden

Arkitektur, Frontend, Backend, Data, Säkerhet, Infrastruktur och DevOps, Test

Period

juli 2026 – pågår

Nästa projektBehörighetsstyrd AI-sökning