Zum Hauptinhalt springen

Wira, unsere Zeiterfassung und Buchhaltung as Code

Justin

In diesem Blogbeitrag versuchen wir, einen Einblick in die Entscheidungen und Überlegungen zu geben, die wir als neues Startup in der Buchhaltung getroffen haben. Wir zeigen auf, was Wira ist und warum wir das Bedürfnis hatten, unsere eigene Software zu entwickeln. Ebenfalls erklären wir, welche Technologien wir verwendet haben und geben Einblicke in einige wichtige Funktionen.

Was ist Wira?

Mit Wira haben wir ein Projekt entwickelt, mit dem wir Teile der Buchhaltung von riok selbstsändig verwalten können. Zu diesem Zweck haben wir die folgenden Bereiche abgedeckt:

  • Erfassung der Arbeitszeiten
  • Verträge
  • Erstellung von Rechnungen
  • Alarmierung
  • Beschaffung von Arbeitsmitteln
  • Spesen

Kurz gesagt, Wira automatisiert Teile unserer Buchhaltung. Natürlich kann Wira nicht alles, einiges erledigt weiterhin unser externer Buchhalter, wie etwa die Jahresrechnung.

Warum haben wir Wira entwickelt?

Wir wollten eine Software entwickeln, bei der Teile der Buchhaltung in einem einfachen Textformat verwaltet wird. Damit können wir die Daten in einem Versionskontrollsystem wie Git speichern und leicht in einen CI/CD-Workflow integrieren ("Buchhaltung as Code").

Zugegeben, wir wollten auch einfach eine Buchhaltungssoftware, die perfekt auf unsere Anforderungen zugeschnitten ist.

Textformat

Gründe, warum wir ein Textformat für die Speicherung von Buchhaltungsdaten bevorzugen:

  • Mit der Git Commit History sieht jeder, wer welche Buchhaltungseinträge hinzugefügt, geändert oder entfernt hat.
  • Änderungen und Korrekturen können leicht vorgenommen werden, da alles in Textdateien gespeichert ist.
  • Änderungen und Analysen können leicht automatisiert werden.

CI/CD-Pipeline

Gründe, warum wir die Buchhaltungssoftware in einer CI/CD-Pipeline betreiben:

  • Automatische Validierungen, um sicherzustellen, dass nur aussagekräftige Daten in das Buchhaltungssystem gelangen.
  • Kosten: Der Betrieb von Wira kostet uns nichts.
  • Verbesserte Zusammenarbeit und Kommunikation (z.B. bei der Fehlersuche)
  • Einfache periodische Abläufe (z.B. Erstellung von Rechnungen am Ende des Monats)

Technologien

  • C#: Interpreter von Buchhaltungsdaten, bereitet die Daten auf und verteilt sie dann weiter.
  • GitLab: Speicherung der Buchhaltungsdaten, CI/CD-Plattform, automatisierte Warnungen über GitLab Issues (z.B. offene Rechnungen).
  • Carbone: Open-Source-Dokumentgenerator zur Erstellung von Rechnungen auf Basis von Word-Vorlagen.
  • Google Looker Studio mit Google Sheets: Visuelle Darstellung der aufbereiteten Buchhaltungsdaten in Diagrammen und Tabellen.
  • Google Drive: Speicherplatz für die Word-Vorlagen und die generierten Rechnungen.

Buchhaltung

Für die Aufbereitung der Daten liest Wira die entsprechenden Dateien aus einem Git-Repository.

Arbeitsverhältnis

Pro Jahr wird eine Datei erfasst, die Mitarbeiter, Stellenprozente, Ferien und Arbeitszeiten enthält.

year: 2023
hours_per_week: 42 # Arbeitszeit pro Woche (auf 100% Pensum)
vacation_days: 25 # Ferientage pro Jahr (auf 100% Pensum)
yearly_equipment_budget: 2000 # Gerätebudget pro Jahr
max_equipment_budget: 6000 # Maximales Gerätebudget
official_holidays: # Offizielle Ferientage
- 2023-01-01 # Neujahr
- 2023-04-07 # Karfreitag
- 2023-04-10 # Ostermontag
- 2023-05-18 # Auffahrt
- 2023-05-29 # Pfingstmontag
- 2023-08-01 # Nationalfeiertag
- 2023-11-01 # Allerheiligen
- 2023-12-25 # Weihnachten
- 2023-12-26 # Stephanstag
employments: # Mitarbeiter
- employee_name: 'Max Mustermann'
activity_rate: 0.8 # Pensum des Mitarbeiters, hier 80 Stellenprozente
vacation: # Eingetragene Ferien
- from: '2023-02-02'
to: '2023-02-09'
earning_compensation: # EO-Tage, z.B. WK oder Zivilschutz
- from: '2023-03-02'
to: '2023-03-05'
description: 'WK'
paid_days_off: # Sonstige bezahlte, arbeitsfreie Tage wie Umzug oder Hochzeit
- from: '2023-05-02'
to: '2023-05-02'
description: 'Umzug'

Ferien und sonstige Abwesenheiten werden von jedem Mitarbeiter selbst eingetragen. Sobald Änderungen vorgenommen wurden und diese ins Git Repository hochgeladen wurden, aktualisiert Wira automatisch die verfügbaren Ferientage und weitere Zahlen.

Verträge

Eine weitere Grundlage stellen die Verträge mit unseren Kunden dar. In einem Vertrag können wir grundlegende Informationen über den Kunden festhalten. Pro Vertrag pflegen wir eines oder mehrere Projekte, um unsere Aufwände detailliert zu protokollieren.

client: riok # Kunde
name: wira # Vertragsname
id: 999999
owner: Manuel # Vertragsverantwortlicher
last_invoice_date: 2022-10-31 # Letzte Rechnungsstellung
hour_rate: 150 # Stundensatz (Beispiel)
quota_hours: 500 # Stundenkontigent
start: 2022-12-01 # Vertragsstart
end: 2023-05-31 # Vertragsende
invoice_options: # Rechnungskonfiguration
template_id: XXX # Rechnungsvorlage
salutation: Sehr geehrte Damen und Herren
valediction: Besten Dank für euren Auftrag
address:
company: Firma AG
name: Herr Max Mustermann
street: Musterstrasse 12
zip: 9000
city: St. Gallen
country_code: CH
include_swiss_qr_bill: true # Ob QR-Rechnung generiert werden soll
additional_repeated_positions: # Monatlich wiederkehrende Rechnungspositionen
- description: Hosting
total: 200
projects: # Projekte des Vertrags
- name: wira
display_name: Wira Buchhaltung
quota_hours: 500 # Stundenkontigent des Projekts

Arbeitszeiten

Korrekte und detaillierte Arbeitserfassung ist bei riok ein wichtiges Thema. Jeder Mitarbeiter erfasst seine geleisteten Stunden für einen Kunden und ein Projekt, dazu wird meist auch noch eine Beschreibung der Tätigkeit hinzugefügt.

- date: '2022-10-05'
client: 'riok'
project: 'wira'
description: 'WIRA-100: Dokumentation erstellen'
start: '13:00'
end: '16:00'

Die verarbeiteten Daten werden danach an Google Sheets übertragen, was uns die visuelle Darstellung der Daten über Google Looker Studio ermöglicht:

Generierung von Rechnungen

Die Rechnungen werden anhand der summierten Arbeitszeiten und der Vertragsdaten erstellt.

Die Vorlage für die Rechnung wird als Word-Dokument in Google Drive abgespeichert. Diese Vorlage ist mit Platzhaltern versehen, die bei der Erstellung einer bestimmten Rechnung gesetzt werden.

Rechnungen werden automatisch jeden Monat von Wira erstellt.

Beispiel Rechnung

- invoice_date: 2022-10-31
due_date: 2022-11-30
invoice_filename: R202210-342_riok_wira_20221101.pdf
invoice_id: R202304-342
client: riok
contract: wira
amount: 500
amount_incl_vat: 538.5
received: 2022-11-07

Das resultierende Word/PDF-Dokument sieht wie folgt aus:

Alarmierung

Wurde eine fällige Rechnung noch nicht bezahlt oder ist das Stundenkontigent eines Vertrags bald aufgebraucht, informiert uns Wira aktiv darüber.

Durch die Erstellung von GitLab Issues wird der verantwortliche Mitarbeiter benachrichtigt. Wira definiert dabei ein Fälligkeitsdatum, kurz vor dessen der verantwortliche Mitarbeiter erneut eine Nachricht von GitLab erhält und somit optimal über den Umstand informiert wird. Schliesst der Mitarbeiter das GitLab Issue wird dies durch Wira erkannt und es erfolgen keine weiteren Nachrichten in derselben Angelegenheit.

Fazit

Die beschriebenen Teile der Buchhaltung werden im Textformat gespeichert und vollautomatisch verarbeitet. Außerdem werden die Rechnungen automatisch und individuell für jeden Kunden erstellt. Wir können Wira nach Belieben anpassen und so vollständig auf unsere Bedürfnisse zuschneiden und erweitern.

Ein Nachteil ist, dass Wira von verschiedenen externen Diensten wie GitLab, Google Drive oder Google Looker Studio abhängig ist. Kann einer dieser Plattformen aus einem beliebigen Grund nicht weiter verwendet werden, wurde das Proramm speziell so entwickelt, dass diese Plattformen einfach austauschbar sind.

Ein weiterer erwähnenswerter Punkt ist, dass alle Mitarbeiter alle Daten einsehen und bearbeiten können. Für uns bei riok ist Transparenz sehr wichtig. Durch Wira kann diese Transparenz im ganzen Team gewährleistet werden. Uns ist aber bewusst, dass dieser Ansatz für andere (vor allem grössere) Unternehmen problematisch sein könnte.

Wira ist seit über 4 Jahren im Einsatz und wir können mit Stolz sagen, dass Wira für uns ein Erfolg ist.