Billing restricted to directors
Every billing route returns 403 to anyone but a director.
CRM platform
A legal-operations CRM that connects matters, tasks, time, correspondence, documents, billing, registries, and reporting inside one daily workspace.
Deadlines, client records, matters, correspondence, time, billing and specialist registries needed one operating system, without flattening the differences between them.
The legal-operations CRM on desktop and mobile, on a seeded demo firm: matters, tasks, time and billing in one daily workspace.
Active matters and today's load, then tasks split across overdue, today, tomorrow and the next seven days.
Every matter with its client, status and dates, filterable by state.
The client register, with contact, address and a working note on each row.
One NNN-STL sequence across four currencies, with paid, pending and overdue in view.
Applications by number and class, each with its next action and the days left to take it.
Each power of attorney with its dates, legalisation state and days remaining.
Time entries against matters, with rate, amount and billing state.
Every billing route returns 403 to anyone but a director.
One NNN-STL sequence. Deleting an invoice renumbers the rest, transactionally.
USD and EUR issue in English, RUB and UZS in Russian.
Each invoice keeps the bank snapshot it was generated with.
Mark many invoices paid at once, one shared date or one each.
The DOCX carries signature and stamp. The HTML preview never does.
Problems we hit
Deleting an invoice from the middle of a sequence requires shifting all higher numbers down immediately. Restoring it requires shifting them back up.
Both operations are transactional, fingerprint-confirmed, and preserve external file references, making the renumbering a precise per-row operation rather than a bulk recalculation.
An earlier approach injected signature and stamp images into the DOCX at generation time, adjusting geometry at runtime. This caused layout drift.
The geometry is now embedded in the DOCX templates, and runtime injection, rotation, or floating-anchor manipulation is prohibited.
Invoice amounts were stored as floating-point REAL columns, which introduces rounding errors in currency arithmetic.
The canonical representation is now integer minor units. Application arithmetic uses Decimal with explicit half-up conversion, while the legacy REAL columns remain as temporary dual-write shadows during migration.
If a bank setting referenced by invoices is permanently deleted, those invoice rows must remain visible to directors and retain their frozen snapshot.
The operation unlinks the setting from the invoice rows but does not remove them, so no financial record disappears with its reference.
Decisions we made
The main product decision was to prioritize operational density over a sparse marketing-style interface.
Staff need to scan lists, compare states, and move between linked records quickly. The navigation therefore remains visible and predictable, while filters and creation actions sit close to the data they affect.
The second decision was to extend a common CRM core with domain-specific registries instead of forcing legal work into generic notes.
Trademarks, watch notices, powers of attorney, leads, and correspondence have their own entry points but remain part of the same product model.
Responsive behavior was treated as useful access, not a separate reduced product.
The mobile surface preserves dashboard and task visibility, while the fuller desktop layout remains the main environment for record-heavy work.
Contact
For professional opportunities, collaborations, or selected freelance work.