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 комментариев
Робохроники ИИ: машинное зрение следит за плавкой стали и доменными печами, а нейросети помогают в химпроме

В прошлом месяце нейросети берегли климат, компьютерное зрение следило за производством, а дипфейки помогали заработать. Главное за август в свежем выпуске дайджеста от команды RDL by red_mad_robot.

Apple отключила функцию «Частный узел» в России — она позволяла скрыть IP-адрес Статьи редакции

Накануне сенаторы Совета Федерации пригрозили компании штрафами и уголовными делами за отказ в сотрудничестве.

«Цифровые кочевники» — деловые туристы нового времени

Человека из сферы диджитал, который свободно работает в любой точке мира, где ему комфортно и есть интернет, называют «цифровой кочевник» или «диджитал номад». Более 20 стран поддерживают такой формат работы и путешествий, рассчитывая на профит для внутренней экономики. Плюсы очевидны — страны пополняют налоговый бюджет и восстанавливают…

Авторы бывшего канала VTimes узнали детали нового налогового режима для малого бизнеса от ФНС — ставка 7-8% от доходов Статьи редакции

Есть ограничения по выручке и видам деятельности — но их пока не определили.

Как запустить e-commerce бизнес на зарплату. Полный гайд с нуля до выручки в миллион рублей в месяц

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

«Вам звонок из Циан»: зачем компания скупает номера телефонов и как call-tracking помогает клиентам сервиса

Подменные номера телефонов защищают от нежелательных звонков и упрощают аналитику продаж

Как работать удалённо по московскому времени, если живёшь в Сибири

Команда ИТ-компании Southbridge — о преодолении трудностей часовых поясов: графике работы, планировании и отдыхе.

Выращивает салат в автоматах и хочет спасти мир: как немецкая Infarm привлекла $315 млн на «рукколу для богатых» Статьи редакции

Пока одни говорят, что вертикальные фермы могут спасти планету, другие уверены — это всего лишь развлечение для богатых. Как работает отрасль, разбирается Wired.

Вертикальные фермы компании Infarm Infarm
«Белые хакеры» нашли сервис массовой разблокировки iPhone — он собирает пароли и «отвязывает» технику от iCloud Статьи редакции

Им пользуется в том числе и московская фирма, уверены хакеры.

Rolls-Royce успешно испытала свой первый электрический самолёт Статьи редакции

Spirit of Innovation провёл в воздухе около 15 минут.

Spirit of Innovation Rolls-Royce
Дайджест новостей Сбера: AR-экскурсия, распознавание животных и премия для учёных

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

null