V·NESTERENKO
← Alle Arbeiten
Lead-Entwickler · 2023–25 · 2 Jahre

Zeiterfassungs- und Abrechnungsplattform für Subunternehmer

Vertraulich – Details anonymisiert.

Ein Personaldienstleister erfasste die Stunden von Subunternehmern an einer Stelle, berechnete Urlaubsansprüche an einer zweiten und erzeugte Kundenrechnungen und Löhne an einer dritten. Die Zahlen widersprachen einander oft genug, dass sie von Hand geprüft wurden – die teure Art herauszufinden, dass die eigenen Systeme nicht übereinstimmen.

Die Antwort war kein neues Produkt, sondern selbst gehostetes Redmine, konsequent erweitert: Die Plugins für Zeiterfassung und ERP wurden so weit angepasst, bis ein System Stunden, Urlaub, Rechnungsstellung und Lohn gemeinsam hielt. Etwas Bewährtes zu kaufen und zu biegen war für ein Unternehmen, dessen Geschäft Personalvermittlung und nicht Software ist, die bessere Wahl.

Ich habe zwei Jahre daran gearbeitet und das System als Hauptentwickler getragen.

Wo die Komplexität tatsächlich liegt

Wenig davon ist technisch exotisch, und alles davon ist detailreich:

Abrechenbar und nicht abrechenbar ist kein Schalter. Aktivitätstypen entscheiden, ob eine Stunde auf einer Kundenrechnung landet, und die Regeln unterscheiden sich zwischen dem kundenseitigen Anwesenheitsbericht und dem internen Lohnbericht. Ein großer Teil der Arbeit bestand darin, dieselbe Stunde in beiden korrekt erscheinen zu lassen – oder in keinem von beiden.

Urlaub entsteht aus der Arbeit. Das Anlegen einer Zeitbuchung aktualisiert das Urlaubskonto, sodass Salden aus erfassten Stunden folgen, statt daneben gepflegt zu werden und auseinanderzulaufen.

Rechnungen sprengten die URL. Die Rechnungserzeugung war ein GET-Request, bis die Parameter – Zeiträume, Nutzergruppen, Projektfilter – überschritten, was eine URL trägt. Daraus wurde ein POST: klingt trivial, war eine echte Grenze.

Gehaltsdaten gelangten an die falsche Gruppe. Eine Bedingung im Lohnbericht war invertiert und zeigte Gehaltsdaten allen mit Berichtszugriff statt nur den Superadmins. Eine Zeile Korrektur – und genau die Art Fehler, die dafür spricht, Berechtigungsprüfungen in einem System mit Lohndaten ernst zu nehmen.

Infrastruktur

Es läuft auf AWS ECS, und ich habe die gesamte Umgebung nach Terraform überführt – 41 Ressourcen in rund 1.200 Zeilen: VPC, Subnetze, Routing und Security Groups, ECS und ECR, ein Application Load Balancer mit TLS, RDS PostgreSQL, Service Discovery, Autoscaling-Policies sowie CloudWatch-Log-Gruppen mit sieben Metrik-Alarmen auf Datenbank-CPU und freien Speicher.

Das ist der Unterschied zwischen Infrastruktur, die man neu aufbauen kann, und Infrastruktur, von der man hofft, dass sie weiterläuft. Davor existierte die Umgebung als eine Folge von Konsolenklicks, die jemand einmal ausgeführt hatte.

Daneben gibt es einen kleinen Node.js-Dienst für die Integrationen, die nicht in ein Rails-Plugin gehörten.

Warum es auf dieser Seite steht

Alle anderen Projekte hier liefen zwei bis zwölf Monate. Dieses lief zwei Jahre, und der größte Teil davon bestand darin, etwas in Produktion korrekt zu halten, während täglich damit abgerechnet wurde. Es ist die Arbeit, auf die ich zeigen würde, wenn Sie wissen wollen, wie ich nach dem Launch bin.

Nächstes Projekt →