Создаем сервис "Запись на прием к врачу (турагенту/страховщику/сантехнику - как Вам хочется)" для портала

Аватар пользователя Айдар Айдар 4 апреля 2012 в 1:21

Имея в распоряжении медицинский портал, озадачился созданием столь популярного ныне сервиса "Запись на прием к врачу" - данный сервис очень легко приурочить для других видов "онлайн-заказов", хотя, сразу оговорюсь, что примеры ниже будут именно по записи к доктору (и, кстати, по 6 версии Друпала). По сути сервис представляет собой ни что иное как обычная отправка данных юзера по e-mail с последующим звонком юзеру - непосредственно запись (читай "бронирование" во всех его смыслах) происходит уже после обговора врача с клиентом.

Суть сервиса проста: посетитель Вашего портала (именно портала, т.к. речь пойдет о каталоге организаций) подбирает себе компанию по критерию, переходит к форме записи, отправляет ее на предустановленный (админом или тем, кто редактирует ноду организации) эл. адрес - со стороны представителя организации требуется лишь указать e-mail адрес для получения писем с формой записи.

Требуемые модули:

Модули по вкусу:

Урок для начинающих (ни капли кода), но уже имеющих навыки работы с вышеуказанными модулями.

Итак, весь процесс делим на 3 этапа (с учетом того, что тип(ы) материала каталога уже созданы:

  1. Создаем дополнительные поля в типе материала каталога
  2. Создаем вебформу с нужными компонентами
  3. Создаем представление с раскрытыми фильтрами

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

1.1. Создаем поле типа E-mail - машинное имя поля в качестве примера мы возьмем "doctor_reservation_email"; настройки поля по желанию, кроме одной: число значений (Number of Values) не меняем - оставляем "1" (также рекомендую указать в справке, что этот адрес используется для отправки формы записи на прием).

1.2. Создаем поле типа Link - настройки поля:

  • Значение по умолчанию: Заголовок: "Записаться на приём"; URL: "reservation?value=[field_doctor_reservation_email-raw]"
  • Number of Values: 1
  • Ссылка заголовка: Необязательный заголовок
  • Разрешить пользовательские маркеры: ставим галочку
  • Атрибут Rel: nofollow (если не нужно, чтобы индексировалась страница формы)

Далее переходим к настройкам отображения и скрываем оба наших поля.

2. Создаем вебформу.

Url-алиас нашей формы необходимо указать такой: reservation

Из компонентов перво-наперво добавляем компонент типа "E-mail" - настройки компонента:

  • Значение по умолчанию: %get[value]
  • Label display: нет
  • Выключено: ставим галочку

Далее добавляем остальные компоненты, которые мы хотим видеть в форме записи. Особо отмечу, что для того, чтобы человек мог записаться на определенную дату и время, вроде бы нужен модуль Date (не помню точно, он ли реализует поп-ап календарь (возможно, JQ Update), но сносить, чтобы проверить, не стал).

Затем переходим на вкладку "Электронные адреса" и выбираем радиобаттон "Значение компонента: Наш_компонент_с_эл._адресом"

Теперь на странице просмотра вебформы мы можем увидеть поле E-mail адреса - по-хорошему его нужно скрыть, но вот как сделать это лучше, чем параметром display: none, я не нашел UPD (спасибо Андрею (см. комменты ниже)): поэтому в настройках скрываем этот компонент чекбоксом "Личное"/

3. Создаем представление, где добавляем обязательно фильтр по полю созданного нами поля "doctor_reservation_email", а оператором указываем "Не пусто" (Is not empty), далее добавляем нужные нам раскрытые фильтры для удобного поиска компаний.

Затем добавляем созданное в п.1 нами поле типа ссылка, настраиваем его, как удобно и добавляем остальные поля.

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

Пример такого сервиса можно посмотреть здесь (страничка будет постоянно меняться - вероятнее всего, пока там не будет ни одной компании).

Возможно я что-то пропустил, так что заранее прошу прощения!

Друпал воистину всемогущ!

Комментарии

Аватар пользователя MasteRRR MasteRRR 4 апреля 2012 в 7:22

Вопросы:
1. Пользователь А записался на 14.00. После приходит пользователь Б, записывается на 14.00. Каким образом будет разруливатся ситуация?
2. Заходит пользователь-Редиска, который тупо забивает очередь собой или клонами. Как будете бороться?
3. Пользователь ошибся, введя данные в вебформу или, допустим, не сможет придти по какой-нибудь причине. Сможет ли он отменить свой "заказ"?
4. У врача изменилось время приема/он заболел/форс-мажор. Кто и как будет уведомлять уже записавшихся на выпадающее время?

Аватар пользователя alex_shut alex_shut 4 апреля 2012 в 11:06

Не асилил, букаф много. но в закладки, пригодитсо когдат.
Айдар, спасиб за поделилсо опытом)

Аватар пользователя Айдар Айдар 4 апреля 2012 в 13:16

"MasteRRR" wrote:

1. Телефонным разговором.
2. Никак.
3. Телефонным разговором.
4. Телефонным разговором.

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

Аватар пользователя MasteRRR MasteRRR 4 апреля 2012 в 14:25

"Айдар" wrote:
1. Телефонным разговором.
2. Никак.
3. Телефонным разговором.
4. Телефонным разговором.

А, ну понятно, фактически получается услуга "Мы вам перезвоним." Если клиентов такое решение устраивает - почему бы и нет?

Аватар пользователя Айдар Айдар 4 апреля 2012 в 14:49

"MasteRRR" wrote:
Если клиентов такое решение устраивает

Вот этого пока не знаю - маркетингом этого дела не занимался. Но
"Айдар" wrote:
Таким образом уже третий год работаю с аналогичным сервисом по туризму (причем, участники, кому приходят "заказы" платят за это деньги), и понял, что уведомление по эл. почте - самое то.

А тут еще и бесплатно. Smile

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

Аватар пользователя Valeratal Valeratal 4 апреля 2012 в 15:28

"Айдар" wrote:
предотвратить все 4 пункта, доделал бы.

каким образом? требуя скан паспорта и морду в вебкамеру? Smile

Аватар пользователя Andruxa Andruxa 4 апреля 2012 в 18:05

Асилил. Понравилось.

"Айдар" wrote:
по-хорошему его нужно скрыть, но вот как сделать это лучше, чем параметром display: none, я не нашел.

Включить чекбокс "Личное"
насчет времени записи - встречал модуль для уберкарта, позволяющий пользователю выбирать время доставки из предлагаемых таймслотов, при этом учитывается максимальное кол-во заказов, доступных к доставке на это время, и в случае его превышения, таймслот становится недоступным

можно было бы воспроизвести что-то подобное для вебформы, но имхо не стоит оно того - достаточно дать возможность пользователю выбрать желаемый промежуток времени (первая/вторая половина дня или 8-10/10-12/12-14/... часов), а администратор уже согласует более точное время приёма, исходя из загруженности специалиста (с учетом посетителей из оффлайна) - собственно, то что предлагает Айдар.

Аватар пользователя Айдар Айдар 4 апреля 2012 в 22:26

"Valeratal" wrote:
требуя скан паспорта и морду в вебкамеру?

Это да! Опять таки, сравнивая с тем, что уже реализовано, были злые кадры, которые вписывали в кач-ве контактных данных телефоны конкурентов.

"Andruxa" wrote:
Включить чекбокс "Личное"

И правда! Спасибо! Smile
"Andruxa" wrote:
насчет времени записи

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