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.
The responsive dashboard gives staff a starting point for matters, tasks, events, correspondence, and daily activity.
Task views support status, assignee, due-date, and search filters without exposing client records in this portfolio capture.
A shared creation entry point exposes the CRM's connected record types without forcing staff through separate tools.
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.