Ayman, home

Case studies / Correct invoices in nine languages

Correct invoices in nine languages.

In a multi-tenant SaaS for EV charging management, I internationalised invoicing and moved it to a template pipeline tested in CI.

role
Full-stack developer
year
2025 → hoy
stack
Ruby on RailsRSpecMySQL AuroraMongoDBGitLab CISentry
links
—
Invoice datacustomer · lines · taxesHTML/CSS templateper-domain brandingCI: build and teston every change// one PDF per languageESCAENFRPTITDENL9 languages · illustrative
// context

Context.

This is my current job at Etecnic, where I joined as an intern and stayed on a permanent contract. The product is a multi-tenant SaaS that energy operators and airports use to manage EV charging.

I take features end to end: REST endpoints with role-based permissions and RSpec tests, per-domain branding and, above all, invoicing. I do not publish company code or material: this page only covers my part.

// problem

The problem.

Energy operators and airports in several countries need legally valid invoices in their own language and with their own branding.

// decisions

What I decided, and why.

01

Invoicing in nine languages

what
Every invoice string comes from translations rather than hard-coded text, so each customer receives it in their own language.
02

PDFs built from HTML and CSS templates

what
I migrated invoice PDF generation to HTML and CSS templates, with their own step in the CI pipeline.
03

Per-domain branding

what
Each customer sees the app and its documents with their own brand, depending on the domain they use.
// result

Result.

  • Invoices in each customer’s language and brand, in production.
  • Role-based endpoints covered by RSpec tests.
// what i learned

What I learned.

  • How a real development and production environment works: Git flow, branches, sprints and reviewed merge requests.
  • How to read a problem in production, find its cause and fix it.
  • How to keep learning on my own inside a team: sometimes you have to find your own exact way of doing things.