So, I’ve already spent 12 hours working on the new section and realize it’s only the beginning.
- The Contracts section has been added;
- Each contract includes the basic fields: date, number, amount, term;
- Contracts are linked to projects and counterparties (the parties);
- For each party you can separately specify signatures and legal grounds for cooperation (charter, registration certificates, etc.);
- Through counterparties contracts are linked to invoices. When creating a contract, a snapshot of the invoice is created and stored as a separate entity so later edits to the invoice won’t affect old contracts;
- You can set a planned term for the contract. The system already shows how much time remains until the planned end date or highlights the amount of overdue time;
- Contracts can be linked to files (for example, to upload originals);
- Contracts have many statuses — and I’ve added functionality to view the history of contract status changes. This will be useful as automation improves.

Next I will work on linking contracts with other NormCRM entities — tasks, meetings, and so on. This will let you see, for example, how many hours were worked under a given contract and what the resulting hourly cost is if the contract was priced as a fixed-price (turnkey) job.
After that — generating derived documents in one click: issuing invoices and acceptance certificates.
During the process I came up with a couple of new ideas related to recording agreements even without formal contracts, as well as a unified end-to-end reminder system.
I’ve also recently worked on small fixes and improvements:
- Not all menu items fit in the horizontal navigation anymore, so I added a "More" item that hides what doesn’t fit. I think this is a temporary solution and later I will switch to a vertical navigation menu;
- I liked how the "More" menu looks, so I styled all other dropdown menus in NormCRM the same way;
- Added row highlighting in tables on hover for desktops;
- Found several places where English translations didn't apply because they were buried deep in JS or PY files. Fixed them;
- Made modal windows with search fields (filters) stick to the top edge when their height changes instead of jumping around the screen.