Case management system for dentists and labs.
DCMS is a CRM platform which brings labs and dentists together with their main points of contact: making an order (case), receiving updates on cases and scheduling pickups. DCMS works in real-time, so dentists or lab users are not required to make phone calls to each other, or to send faxes to receive updates.
The application was started as a small product for one lab, which was tired of processing faxes and answering phone calls from their dentists, and is now used by many labs and dentists around the US.
It was necessary to come up with a way to track the actions of the users, as well as to notify them by email and push notifications. As a result, we decided to create a global service responsible for selecting recipients of notifications, determining user notification settings, and connecting to all types of sending events, namely sockets, push notifications for IOS and Android, and emails. Everything is in one place, and, thanks to this, it is convenient for us to make changes to the logic of the service and track possible errors.
We had a performance problem because users download the same cases and pickups each time for each change in filters or data. Potentially the user could download thousands of cases over and over again, and this slowed down the server and the front of the user due to redrawing and loading. As a result, we came to the decision to download all the cases and pickups related to this user at his first login, and then only modify the data based on the event socket, or download data if the user left the computer only for the last time interval. To store data, we started using IndexedDB, a data storage on the user side. This has significantly improved the performance of the users.
We had the task of developing a way to work with third-party resources which include both sending and receiving data. Using the inside of API was illogical and not safe from a security point of view. As a result, we developed Public API from our side that allowed the receipt of data from the outside and an integration service that will send data to third-party applications. We also needed to somehow synchronize these processes, as well as add real-time. To solve this problem, we connected these services with the main ones using sockets.
To develop an insight system, it was originally planned to collect data from the SQL database and display it to users. However, such global queries with a large number of calculations slowed down the server. As a result, we found a solution; we launched a mongo database on a separate service, where we record only those actions that are important for insights. Thanks to this, we significantly increased the speed of the server. Then, a new problem arose - what to do with previous data. To solve it, we came up with migration, which, based on all previous notifications of users, collects all past insights.