Skip to main content

How we built Wira, our Accounting as Code Software

Justin

In this blog post, we'll try to give you insights into decisions and considerations that went into our Accounting as a new start-up. We'll start by showing you what Wira is, and why we felt the need to develop our own Software. After that, we'll show you what technologies we used, and give you insights into some key features.

What is Wira, what issue does it solve?

With Wira we have developed a project with which we manage the parts of riok's accounting. For this purpose we have covered the following areas:

  • Recording of working hours
  • Contracts
  • Invoice generation
  • Alerting
  • Procurement of work equipment
  • Expenses

In short, Wira automates parts of our accounting. Of course, Wira can't do everything, some things are still done by our external accountant, such as the annual financial statement.

Why did we create Wira?

We wanted to develop a software where the accounting is managed in a in a simple text format so that we could manage it in a Version Control System such as Git, and easily integrate it into a CI/CD workflow ("Accounting as Code").

Admittedly, we also simply wanted accounting software that was perfectly tailored to our needs.

Text format

Reasons why we prefer a text format for storing accounting data:

  • Everyone sees who added, changed or removed which accounting entries with the Git Commit History
  • Changes and corrections can be made easily because everything is stored in text files
  • Changes can be easily automated

CI/CD pipeline

Reasons why we run the accounting software in a CI/CD pipeline:

  • Automatic validations to ensure that only meaningful data enters the accounting system
  • Costs: The operation of Wira costs us nothing.
  • Improved collaboration and communication (e.g. troubleshooting)
  • Easy, reliable scheduling (e.g. generate invoices at the end of the month)

Technology

  • C#: Interpreter of accounting data, prepares the data, and then redistributes it.
  • GitLab: Storage of accounting data, CI/CD platform, automated alerts via GitLab issue (e.g. open invoices).
  • Carbone: Open source report generator to generate invoices based on Word templates.
  • Google Looker Studio with Google Sheets: Visual representation of the prepared accounting data in charts and tables.
  • Google Drive: Storage for Word templates and for the generated invoices

Accounting

For the preparation of the data, Wira reads the relevant files from a Git repository.

Employments

In the employment file, data such as employees, vacation and working hours are described. We record one such file per year.

year: 2023
hours_per_week: 42
vacation_days: 25
yearly_equipment_budget: 2000
max_equipment_budget: 6000
official_holidays:
- 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:
- employee_name: 'Max Mustermann'
activity_rate: 0.8 # 80 Stellenprozente
vacation:
- from: '2023-02-02'
to: '2023-02-09'
earning_compensation:
- from: '2023-03-02'
to: '2023-03-05'
description: 'WK'
paid_days_off:
- from: '2023-05-02'
to: '2023-05-02'
description: 'Umzug'

Vacations and other absences can be entered by each employee. As soon as changes are made, and have been uploaded to the Git repository, Wira automatically updates the available vacation days and other numbers.

Contracts

Another basis are the contracts with our customers. In a contract, we can provide basic information about the customer. Per contract we maintain one or more projects to be able to create a detailed invoice.

client: riok
name: wira
id: 999999
owner: Manuel
last_invoice_date: 2022-10-31
hour_rate: 150 # Example
quota_hours: 500
start: 2022-12-01
end: 2023-05-31
invoice_options:
template_id: XXX
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
additional_repeated_positions:
- description: Hosting
total: 200
projects:
- name: wira
display_name: Wira Buchhaltung
quota_hours: 500

Worklogs

Correct and detailed worklogs is an important topic at riok. Each employee records his hours worked on a customer and project, and usually a description of the activity is also recorded.

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

The processed data are then transferred to Google Sheets, which allows us to visually display the data via Google Looker Studio:

Invoice generation

Invoices are generated using the summed worklogs and the contract data.

The template for the invoice is stored as a Word document in Google Drive. This template is provided with placeholders, which are set when generating a specific invoice.

Revenue example

- 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

The resulting Word/PDF document will look like this:

Alerts

If a due invoice has not yet been paid or the quota of a contract is about to be used up, Wira informs us about it.

By creating GitLab Issues, the responsible employee is notified. Wira defines a due date shortly before the responsible employee receives another message from GitLab and is thus optimally informed about the circumstance. If the employee closes the GitLab issue, this is recognised by Wira and no further messages are sent regarding the same issue.

Summary

The described parts of the accounting are stored in text format and processed fully automatically. In addition, invoices are generated automatically and individually for each client. We can customise Wira as we wish and thus completely extend it to our needs.

A disadvantage is that you are dependent on various external services such as GitLab, Google Drive or Google Looker Studio. However, the program was developed so that if one platform can no longer be used for any reason, it can be easily replaced by another platform.

Another point worth mentioning is that all employees can view and edit all data. For us at riok, transparency is very important. Through Wira, this transparency can be guaranteed throughout the team. However, we are aware that this approach could be problematic for other (especially larger) companies.

Wira has been in use for over 4 years and we can proudly say that Wira has been a success for us.