INOSTUDIO

Как подружить международный обучающий портал с тайм-зонами. История проекта WES

WES – международный онлайн-сервис для изучения английского с носителями языка. Данный сервис позволяет пользователям выбрать удобный формат обучения, предлагая четыре типа пакетов занятий:

  • пробный – доступен всем новым партнерам в течение двух недель с момента регистрации с целью оценки удобства сервиса;
  • оценочный – предполагает разовое индивидуальное занятие для оценки знаний студента. Включает в себя: оценочный тест, эссе и онлайн-урок с учителем;
  • индивидуальный – подразумевает занятия преподавателя со студентом в формате «один на один»;
  • групповой – представляет собой занятия для группы студентов от двух до шести человек.

Так как платформа является международной и на ней обучаются студенты с разных континентов, возникла необходимость реализовать корректное отображение расписания в часовом поясе пользователя. С этой целью мы внедрили функциональность электронного расписания занятий. Однако, спустя некоторое время, владелец сервиса обратился к нам с просьбой доработать функциональность таким образом, чтобы пользователи платформы могли переносить занятия на другие даты ввиду различных форс-мажоров у участников образовательного процесса. Для этих целей мы разработали и внедрили гибкую систему переносов занятий.

Гибкая система переносов занятий

В системе предусмотрено несколько ролей с доступом к соответствующей функциональности сервиса. Так, перенос занятия могут запросить партнер, учитель или студент. В зависимости от типа пакета система предоставляет возможность соответствующим ролям подать заявку на перенос одного или серии занятий на более удобное для инициатора время.

После инициации запроса на перенос система:

1. фиксирует данную заявку;

2. устанавливает статус одного или серии занятий в состояние «ожидание переноса»;

3. оповещает всех оппонентов о появлении заявки на перенос посредством системы нотификаций, а также дублирует данную информацию письмом.

Итак, процесс согласования переноса запущен.

Все заявки на перенос должны быть утверждены стороной-оппонентом, или оппонент может предложить другое время проведения занятия. Помимо этого, оппонент может отклонить запрос на перенос, в этом случае система возвращает данное занятие обратно в расписание и присылает уведомления всем заинтересованным сторонам.

Если с переносом одного занятия все более-менее понятно и просто, то что стоит за переносом серии занятий, и что такое, в принципе, серия занятий?

Серия занятий в системе – это уроки, принадлежащие одному пакету, при этом время проведения уроков регулярно относительно дня недели. Допустим, есть пакет занятий, и в нем есть регулярные уроки по средам в 14:30 продолжительностью 1 час. Длительность самого пакета занятий – 3 недели. Инициатор отправил запрос на перенос серии занятий с 14:30 среды на 10:00 понедельника.

В случае заблаговременного переноса и при условии, что оппоненты вовремя отреагировали на запрос, все занятия из серии переносятся с одного дня недели/времени на другой день недели/время. Если же перенос не был утвержден вовремя, то ближайший к текущим дате/времени урок необходимо «отрывать» от серии занятий и работать с ним отдельно. Для остальных уроков из серии занятий запрос продолжает существовать в системе и ждать реакции оппонентов.

Когда такая ситуация возникает? Практика показала, что сторона-оппонент не всегда своевременно реагирует на уведомления системы. Бывали ситуации, когда оппонент замечал уведомление в момент старта занятия по новому времени. Либо заинтересованные стороны не смогли вовремя согласовать новые дату/время, а занятие уже должно было начаться по старому времени. В таких ситуациях занятие может быть «потеряно» без возможности переноса на другие дату/время, удовлетворяющие все заинтересованные стороны.

Для исключения подобных ситуаций было принято решение определить набор правил, когда система берет управление «на себя» и может самостоятельно отклонить перенос занятия. Дополнительно система может простимулировать заинтересованные стороны завершить перенос вовремя.

Перечень правил:

1. Перенос занятия в прошлое невозможен.

2. Перенос занятия в будущее за пределы длительности пакета возможен, но ограничен количеством резервных недель, рассчитанных исходя из длительности пакета.

3. Перенос занятия ограничен действующим контрактом учителя. То есть, если у учителя контракт завершится через три недели, то занятие в будущее можно перенести в пределах этих трех недель.

4. Нельзя инициировать запрос на перенос:

– если до начала занятия осталось менее 10 минут;

– если занятие уже началось.

5. Если занятие переносят в будущее по отношению к запланированному времени урока и заявку на перенос не утвердили, то:

– за час до прежнего времени проведения занятия система информирует заинтересованные стороны о приближении начала занятия и побуждает пользователей либо завершить перенос, либо отменить его и провести занятие по ранее запланированному времени;

– за 10 минут до нового времени проведения занятия система автоматически отклоняет перенос с соответствующим оповещением всех заинтересованных сторон. Занятие остается в состоянии «ожидание переноса».

6. Если занятие переносят в прошлое по отношению к запланированному времени урока, но все еще в будущее по отношению к текущему времени, и заявку на перенос не утвердили, то:

– за 10 минут до нового времени проведения занятия система автоматически отклоняет перенос с соответствующим оповещением всех заинтересованных сторон. Занятие остается в состоянии «ожидание переноса»;

– за 10 минут до запланированного времени проведения занятия система снова информирует пользователей о незавершении переноса и необходимости перенести занятие на другое время.

В случае переноса серии занятий и при выполнении условий, описанных в пунктах 5 и 6 выше, соответствующее занятие «отрывается» от серии и обрабатывается отдельно.

Для реализации вышеописанных правил была использована state-машина. С помощью нее были описаны все необходимые состояния объекта «урок», а также правила перехода объекта «урок» из одного состояния в другое.

Сложности, с которыми столкнулись

Бывают ситуации, когда проект и реализованную в нем функциональность приходится «допиливать» за другой командой разработки, и, в данном случае, проект WES не был исключением.

После того как проект попал к нам, мы сразу договорились с клиентом, что будем подключать QA-инженеров. Нас обеспечили не совсем актуальной документацией по бизнес-логике сервиса, но это была наша отправная точка по погружению в детали проекта с последующим выяснением нюансов реализации. Документации по коду не было.

В ходе исследовательского тестирования реализованной на тот момент системы переноса занятий и проверки возможных комбинаций мы обнаружили неверное отображение данных с привязкой ко времени в часовом поясе пользователя.

Как и любое другое web-приложение данный онлайн-сервис состоит из frontend- и backend-частей. Если на backend все более-менее понятно: преобразовал время в UTC и с ним работаешь, то на frontend это же время необходимо показывать и обрабатывать в часовом поясе пользователя. Таким образом, время с backend необходимо конвертировать в текущий часовой пояс пользователя и обратно, или в часовой пояс другого пользователя и обратно.

Реализовать это можно несколькими способами:

1. вручную контролировать разницу между UTC и часовым поясом пользователя, в нужный момент прибавлять или отнимать ее от необходимого времени;

2. использовать готовые решения по работе с часовыми поясами.

Анализируя проблему, мы выяснили, что вся работа с конвертацией времени в часовой пояс пользователя была реализована первым способом. Текущий подход был громоздким и сложным в плане поддержки и развития. Малейшее изменение в коде приводило к появлению новых багов. Используя данный способ конвертации очень легко можно было запутаться: что необходимо сделать с разницей между часовыми поясами в разных комбинациях – прибавить, отнять или оставить неизменной.

В результате было принято решение внедрить JS-библиотеку для работы со временем moment.js. Данная библиотека позволила конвертировать время из одного часового пояса в другой, используя названия часовых поясов. Также библиотека предоставила удобные инструменты форматирования даты и времени при выводе ее конечному пользователю.

Например, приведение времени к часовому поясу пользователя выглядит так:

moment().tz(UserStore.me$.current().timezone)

Для сравнения времени не обязательно приводить их к одному часовому поясу, данная библиотека делает это за вас:

if(momentDate.isBefore(moment().tz(UserStore.me$.current().timezone))) { ... }

Форматирование даты и времени стало более удобным:

moment().format('MMMM Do YYYY, h:mm:ss a'); // February 13th 2020, 1:47:28 pm moment().format('dddd'); // Thursday moment().format("MMM Do YY"); // Feb 13th 20 moment().format('YYYY [escaped] YYYY'); // 2020 escaped 2020 moment().format();

Внедрение данной библиотеки сделало код более читабельным, понятным и легким в поддержке. Помимо этого, количество багов, связанных с отображением времени в требуемом часовом поясе пользователя, начало резко стремиться к нулю. Таким образом, была решена основная проблема конвертации времени в необходимые часовые пояса пользователей.

Что в итоге?

Реализовав гибкую систему правил и уведомлений, мы смогли предоставить пользователям онлайн-портала удобный инструмент для переноса занятий, благодаря которому ни один урок не останется забытым в состоянии «ожидание переноса». В свою очередь, клиент остался доволен тем, что теперь все пользователи системы самостоятельно могут решать вопросы переноса занятий без привлечения администратора и службы техподдержки, а система самостоятельно способна сопровождать процесс переноса занятий до его логического завершения.

Авторы статьи: Людмила Сапрыкина, руководитель отдела тестирования и Дмитрий Василевский, разработчик компании INOSTUDIO.

{ "author_name": "INOSTUDIO", "author_type": "editor", "tags": ["\u0441\u0435\u0440\u0432\u0438\u0441\u044b","\u043f\u043e\u0440\u0442\u0430\u043b\u044b","wes"], "comments": 0, "likes": 11, "favorites": 6, "is_advertisement": false, "subsite_label": "inostudio", "id": 140121, "is_wide": true, "is_ugc": false, "date": "Wed, 08 Jul 2020 11:01:05 +0300", "is_special": false }
0
0 комментариев
Популярные
По порядку
Читать все 0 комментариев
Как OTUS стал платформой для самореализации. История преподавателя

Наш преподаватель, специалист по Data Science, решил поделиться своей историей преподавания. Он рассказал, как пришел в эту сферу, с какими трудностями столкнулся на пути к преподаванию и что ему помогает. А еще поделился советами, как поддерживать внимание студентов и сделать занятия полезными и увлекательными.

XPeng анонсировала электромобиль со складными несущими винтами — он способен не только ездить, но и летать Статьи редакции

Китайский производитель планирует начать серийное производство в 2024 году.

HT Aero
Региональные аэропорты предупредили о возможной приостановке полётов из-за новых правил безопасности Статьи редакции

Чтобы соответствовать новым требованиям, аэропорты должны вложить 3-4 млрд рублей, а затраты могут не окупиться.

«Крутые ИТ-стартапы запускают не только в Кремниевой долине»: путь Insider от офиса в квартире к $47 млн инвестиций

За 9 лет разработчик маркетинговой платформы из Турции открыл филиалы в Польше, Вьетнаме, Индонезии, Дубае, России, Австралии и ещё 19 странах, а в будущем планирует оценку в $2-3 млрд и выход на IPO.

Классификация текста с Elasticsearch

Когда я впервые наткнулся на Elasticsearch, я был очарован его простотой использования, скоростью и параметрами конфигурации. Каждый раз, когда я работал с ним, я находил еще более простой способ достичь того, что я использовал для решения, с помощью традиционных инструментов и методов обработки естественного языка (NLP). В какой-то момент я…

Роботы-курьеры «Яндекса» начнут доставлять посылки «Почты России» в Москве Статьи редакции

Пока заказать доставку можно через приложение «Почты России» на Android в некоторых районах города.

Рынок кикшеринга в России вырос на 200-230% за год, до 12 млрд рублей — исследование Статьи редакции

Но есть и проблемы: производители не успевают делать достаточно самокатов, компетентных сотрудников не хватает, а в СМИ кикшеринг «демонизируют».

Какие акции посоветовать новичку: российские или американские
Путин поручил запретить работу ресторанов и кафе по ночам во всей России Статьи редакции

И рекомендовал обеспечить два выходных для сотрудников, проходящих вакцинацию.

«Самый человечный нечеловек»: как мы развиваем голосового помощника Олега в колл-центре, чтобы он не был похож на других

Сегодня в колл-центрах девяти из десяти самых популярных российских банков по телефону отвечают голосовые помощники. Но не все клиенты ими довольны — нередко в соцсетях можно увидеть жалобы на телефонных роботов, которые должны помогать решать клиентские вопросы, но не всегда это делают.

7 причин начать пользоваться Bright Data Proxy Manager:
null