Back to projects
Finished

SULKO Management

A multi-tenant business system that carries a client from the first quote to recurring maintenance: documents generated, digitally signed and archived without ever leaving the system.

|
SULKO Management
RoleAnalysis, design, development and server management
TeamSolo project
Technologies9 technologies

What it is

An ASP.NET Core application covering the entire commercial cycle of a development studio. It generates quotes, contracts, NDAs and data-processing agreements as real PDFs, sends them out for digital signature, receives the sealed documents back and hands them to the client in their own portal. Every document is built from the data rather than filled in by hand: changing a monthly fee means changing one number, not re-reading six PDFs. It runs on a 2-core ARM machine behind nginx, with a separate PostgreSQL schema per tenant.

Main features

Documents

  • Quotes with a payment plan and the tax wording for the applicable regime
  • Development contracts, NDAs and data-processor appointments (art. 28 GDPR)
  • Deposit and balance invoices, plus recurring maintenance fees
  • Termination records signed by both parties

Client portal

  • Access separate from the back office, with its own authentication
  • Signed documents and signing certificates available to download
  • Project progress and the phase currently being worked on
  • Chat with saved replies and a log of maintenance work

Automations

  • Invoice due-date reminder to the client, with an internal copy
  • Monthly reminder for the maintenance fee to be issued
  • Review request when a project is delivered
  • Push notifications on the device, alongside email

Problems and solutions

Maintenance fees were being folded into the project deposit and balance: on an €8,000 job with twelve €150 monthly fees, the deposit came out at €4,900 instead of €4,000 — and that €1,800 was then billed a second time through the monthly invoices. No error, no exception: just a wrong number nobody had a reason to check.

SolutionThe taxable base was split into two distinct figures, one for one-off items and one for recurring fees, and the property that summed them was deleted so nobody can reuse it by mistake. The calculation is covered by tests that fail if anyone puts it back together.

The signing service did not come back up after a machine restart: the restart directive was missing from the container configuration. The symptom was misleading — the business system answered normally, only signing returned a 502.

SolutionAn override file declaring automatic restart, kept separate from the original configuration so it survives upstream updates. It was a latent failure: it would have happened on the first restart for updates, at night, with nobody watching.

The backups were encrypted with a passphrase that existed only inside the machine being backed up. A safe with the combination locked inside it.

SolutionThe passphrase was moved off the server, and the restore cycle was actually rehearsed rather than assumed: decryption completed and the archive opened, with the database and documents inside.

Project access

Technologies

C#
.NET
ASP.NET Core
Razor Pages
Entity Framework Core
PostgreSQL
Docker
nginx
Linux

Contents

  • What it is
  • Main features
  • Problems and solutions
  • Screens