Inside ReactOS Deutschland e.V.: Donations and how to automate them

Hi all! This is my first blog post designed to shed some light on the foundation behind ReactOS.

Just like many other big Open-Source projects, ReactOS is backed by a foundation supporting the project financially and organizationally. I have been the treasurer of ReactOS Deutschland e.V. since its establishment in 2009 and as such, it has been my duty to do the tedious accounting of all donations. While most of that is happening in the background, you see the results from time to time when I update the public Donors page.

For managing the foundation assets, we are using the Open-Source JVerein package that builds upon the Jameica platform (also Open-Source). It does an excellent job at managing members, accounting and generating financial reports. Both applications are customized for the needs of German foundations (and German tax authorities of course ;)). Another plus is their easy hackability and great support. I can highly recommend them to any German foundation (eingetragener Verein (e.V.)) needing a decent management software.

But as with every tool, also JVerein cannot fulfill all our tasks on its own. The best example is actually the public Donors page. This page is comprised of donation information from several sources, like our PayPal account, regular bank account, etc. JVerein cannot generate this very report, and even less it can output the custom HTML we need for our website.

Therefore, I went ahead and wrote our very own plugin for the Jameica platform with the cryptic name rosev_jameicaplugin in 2011. For 5 years, its only feature was outputting the HTML for the Donors page based on the donations in the database. The actual bookkeeping still had to be done manually, and this became more and more work every year as ReactOS rose in popularity.

Let’s automate that!

This month, I wanted to get the donor list back on track again. But manually entering hundreds of individual donations over 8 months was clearly the wrong thing to do. Time has finally come to automate this process a bit, and I have enhanced our rosev_jameicaplugin for that. Here comes the new Donation Importer:

I did my best to make it as appealing as possible. What it basically does is the following:

  • Completed PayPal transactions in EUR and USD currencies between the given start and end date are downloaded and presented in individual tabs.
  • Each tab has two tables, one for actual donations and one for all other transactions. Only donations will later be imported into JVerein. Transactions can be freely moved between both tables.
  • If a transaction is downloaded, which has already been imported into JVerein previously, it is automatically inserted into the other table to not create any duplicates.
  • Donor names are normalized and transliterated if needed. We don’t want individual names (like all capitalized ones) to stand out on our Donors list. Also we’re required to maintain an accounting in latin encoding.
  • The net amount (after PayPal fees) is booked while the originally donated amount is preserved in another field. This way, we can later create a Donors list with the actual donated amounts.
  • For USD donations, we even need to perform a currency conversion according to the monthly exchange rates given out by our ministry of finance.
  • For whatever reason, there are some people out there, who like to donate just cents that are entirely sucked up by the PayPal fees. I’m reluctant to put such donations on our list and neither does my tool.
  • A simple heuristic tries to figure out whether the donor wants to be anonymously listed on the Donors page. Of course, this can also be corrected manually if the heuristic is wrong.
  • Finally, the total amount in the PayPal account as well as the current total amount in the JVerein accounting is shown. You can always see what the total in JVerein would be like after importing the downloaded donations.

As PayPal is the most popular option to donate to ReactOS by a huge margin, my tool is limited to PayPal imports right now. For this, I’m using the PayPal NVP API. Although it comes with an SDK, this hardly makes things easier than just doing plain HTTP calls directly to the PayPal API Service. Therefore, I refrained from bloating up my tool with PayPal SDK dependencies and just do the API calls myself.

Credits also go to the nice and simple Junidecode library for transliteration. If your name is decoded wrongly, just blame them :-P

While my tool and its workflow are highly specific to ReactOS Deutschland e.V. right now, I hope that it can be useful to other foundations as well. I wouldn’t want anyone to go through such a task again.
You can find the source code on GitHub. Contact me if you have any further questions.

Finally, many thanks to all donors out there who made this even necessary!
Your contributions keep our infrastructure running and the project closer to reaching its goals. I’ll do my best to keep the Donors list on track now. Should be easier now that it’s a matter of minutes instead of days :)