📜 ⬆️ ⬇️

Service online task management, our view


Once, having darted around in search of an online task management system, it was decided to write my own “bicycle”. But with a bias in that area, which, for example, is more important to me - taking into account future and repetitive tasks, and I have not seen a competent approach to this issue in any existing service.

Similar systems are written by a huge number of developers, even some trends can be traced:


In short, I will immediately inform you of the key functions of the system (i.e., those that are either not widely distributed among analogs or are not found at all):

So, there was a small number of dedicated servers in DC Hetzner (Germany), rented for business needs, but poorly used (the main purpose is data storage, so the load is low). Also had experience developing in T-SQL, Delphi, Visual C, .NET. Very little experience was in Javascript, I had to make up.

We are one and a half developers and many subordinate users - testers. The system is actively used in daily work, not related to the development of software. The specifics of the work are such that there are many similar tasks, many of them have not yet arrived, but you need to be able to see and do them in advance.
')
For example, the account of powers of attorney. The main task is not to miss its expiration date and take actions to extend it in advance. The following features were used for this:

First of all, a certain disclaimer. We did not try to make another “combine”, our service is not a system for, for example, bugtracking, since This is a completely different specifics. The service is primarily focused on ordinary "advanced" users who need a little more from task management systems, the scope of application is personal tasks (buy, track, remind, etc.) with the possibility of sharing with other users (let them, relatives, Colleagues).

What they didn’t even try to realize:

I needed the following from task management (the list is, of course, incomplete, but indicative):
  1. The list of tasks is fundamentally in a tree-like form, with folders and subfolders, nesting should be unlimited (whatever they say about the fact that three levels of nesting are enough for everyone - bullshit)
  2. adding tasks by e-mail, and when sent to different addresses - in different subfolders
  3. accounting of household affairs (payment by receipt, checking the oil in the car, tracking the deadlines for payment, etc. with varying degrees of frequency, auto-repetition and setting up notifications about all this in completely different ways - I wanted to warn myself about payment three times, and about some events - warned about the delay for more than a week)
  4. at work - there is complexity in quantity - it was necessary to track the deadlines for powers of attorney, contracts, certificates, etc., and it was also necessary to set up notifications about the deadlines. The number of these tasks is hundreds, so none of the existing task managers have either coped with this or the implementation of all this was inconvenient.
  5. viewing the agenda (the list of current affairs) except for today also for any arbitrary period, and with sophisticated filtering, for example, in one list it was necessary to display current tasks, tasks that will start in the coming week plus all household tasks, except unimportant tasks (with a small priority)
  6. give access to read-only who needs all this
  7. give write access to whoever is needed, and with the rights to change only certain fields of the task (for example, an employee who can only change the status of the task)
  8. use of time zones, since colleagues work with the same data, but in different time zones, so all dates used should be adjusted to the desired time zone
  9. system of tags (tags) - necessarily tree-like, with the possibility of sharing (i.e., that certain tags are visible to other users, and others - only to me)
  10. the possibility of temporarily hiding some tasks (for example - some kind of callus in the eyes - we hide it for 2 days, after which it will appear again). By the way, such a mechanism can be implemented in other ways.

Well and, it is clear that common basic functions are also needed:

4 months of work and in the end I got a kind of “engine” for taking into account the tasks, all I wanted was to implement it.

Briefly about the result.


The basic unit of information is the task. The task has a start date and an end date (due date). If everything is clear with the due date, then it’s worth explaining the start date, since not all similar systems have it. In essence, this is the date from which the task is considered relevant. Those. Assigning a date to a task, it will not appear in the task list until this date comes.

The basis of grouping tasks and sharing access is the concept of “Task List”. Those. a certain set of tasks, for example, “Home”, “Work”, “Computer”, etc. In other systems this may be called a tasklist, project, calendar, workspace, etc. Also, the function of such a division - each list has its own settings of access rights for sharing and its own time zone settings.

Separately about time zones. It seems to me that in practice this is not very necessary for anyone, but we just needed it to be critical. Several of our employees and those who have been granted access work in completely different time zones, editing and viewing tasks from the same lists. If, when setting the date of a task, you specifically do not need to specify a specific time, then when setting up notifications, triggers, it is sometimes necessary to specify a specific time, for example, to change the task status daily at 20-00. Those. the status change should occur exactly at 20-00 of the time zone of the user who set the trigger. To correctly implement this, a time zone is set for each user and a specific task list.

With regard to access rights, then came to the following decision. The user can delegate the right to view / edit a specific task list to another user.

The following rights may be established:

Additionally, subject to the right to edit, a list of fields that are prohibited for the user to edit is established. This allows you to implement such a mechanism for user interaction when working together - someone who owns the rights sets tasks, and someone else who has only a limited set of rights can only mark tasks as completed. Those. You can set tasks without worrying that someone will erase the task itself or correct something in it. It is clear that in project management systems all of this is implemented at a higher level, but we did not try to embrace the immense and implemented a basic set.

View the task tree is possible on any date, both past and future. Since information about the tasks is stored regardless of the current date, you can poke any future date and see the status of the tasks on that date. For example, often, when there is too much time, I want to do something in advance, but if the time has not come yet, then future tasks are not yet shown, because they are in the future. We poke a future date - and see what can be done from future tasks.

Filtration


Using custom filters you can realize the following wishes:

Filters - a thing quite comfortable and flexible, but few people screwed it well. To make it really convenient, you need the ability to group the criteria, it is implemented (thanks to DevExpress, here they have the lion's share of merit).

Later it turned out that the benefits of filters are much greater - they can be used to determine the set of agendas sent to the user every day, plus determine the tasks that need to be synchronized with the google tasks. But we’ll write about google tasks separately.

Mobile version.


I myself spend 80% of my free time on the iPad, so the question of creating an application for iOS / Android was not - it was necessary. And it was decided not to develop it. Totally. They went another way - by flexible synchronization with Google Tasks, you can transfer the main part of your daily work (main task editing, viewing and performance marks, i.e., the main functional tasks) to Google Tasks, and synchronize all information periodically (two-way or one-way). ) with the service. More precisely, the synchronization is automatic, more precisely, periodic (push Google Tasks does not support). Applications for Google Tasks are more than enough, some are just masterpieces. Why not reinvent the wheel in this part, but use other people's work :)

The technical side.


The service is written in ASP.NET, spinning on one dedik. DB - PostgreSQL, spinning on the other.
It was originally written in MSSQL, but then it became clear that the postgres is more suitable. It was too heavy to rewrite everything for postgres, but it was worth it.
80% of business logic is implemented in the database, so it somehow works faster.
Used server components DevExpress - the main load lies on ASPxTreeList. Yes, it was necessary to use server components, let this extra traffic for the client, but otherwise do not implement the work with thousands of tasks and some functions. Yes, this leads to a certain inertia of the work of the "tree", but the "response" of the order of 200-300 ms is almost imperceptible, therefore it has. Of the similar components I tried and Telerikov, but there are very unpleasant brakes when folding / unfolding the tree, it is uncomfortable to work.
ASP.NET WebForms is used, I know that the technology is a bit outdated, but almost all the work is focused on one page and the constant callbacks of one element, so the transition to MVC would give little. And the eternal problem of oversize ViewState seems to have minimized.
Two separate applications made mail operations (receiving tasks by mail and sending) and synchronizing with Google Tasks. They wrote on Delphi.

Again disclaimer


  1. For the sake of speeding up development, many relatively infrequently used parts of the interface (editing task lists, triggers) are written using ready-made controls from DevExpress, so a bit heavy
  2. All common browsers are supported, but there may be problems with older versions. IE8 sometimes gives errors, but since there is no clean IE8 at hand, hands have not reached the point of correcting errors yet.
  3. Synchronization with Google Tasks is working, but angry Google has not sufficiently increased the quota for requests to their API, so theoretically, in the event of an influx of users who configure this feature, it is possible to stop synchronization at night at first. I'll beat their support as much as I can.

Monetization and data security


Monetization in the foreseeable future, of course, is not planned. If it is, it is only in the case of a constant growth of active users and an increase in the need for capacity. At the moment, we have enough resources to allocate a couple of servers for this project without hesitation, especially at hetzner prices. In which case - you can increase the amount. If any paid accounts are entered, then the correct practice is that previously registered users will receive a lifetime free “premium” account. About data integrity - in case of closing the service, all users will be notified and there will be at least two months for data transfer. If someone knows how best to offer users to back up data - please let us know. For the time being, nothing happens to me except Google Tasks synchronization. It is possible to fasten the export, for example, in csv.

Plans



Well, a little later I will post a post in more detail about the triggers and synchronization with Google Tasks, there is something to tell.
Link to the service itself - betasked.ru
UPD In my opinion, many who were afraid of the first screen, but nothing prevents to remove unnecessary fields, choose a design theme and work like this:

or so:
image

Source: https://habr.com/ru/post/204102/


All Articles