Техническое задание

Формат сдачи работ: .zip архив с файлами модуля для установки модуля через бэкенд 

Роли пользователей
В системе предусмотрены 3 роли пользователей (за исключением роли - суперадминистратор): Диспетчер, Водитель и Клиент.

Модуль - "Заказы"

Описание
Модуль "Заказы" - служит для создания и обработки заказов.
Состоит из административной части (бэкенд) и форм создания и отслеживания заказа.

Основные функции модуля, работа которых должна быть стабильна:
•	Регистрация пользователя (фронт енд).
•	Интерактивная форма создания билета/заказа (фронт енд)
•	Интерактивная форма отслеживания статуса билета/заказа (фронт енд)
•	Прием и модерация заявок для диспетчера (бэк енд)
•	Область работы с заявками для пользователей (бэк енд)
•	Область работы с историей, пользователями и стат. данными для диспетчера. 
•	Кабинет пользователя (бэк енд).

Фронтенд модуля "Заказы"

Содержит динамические представления (шаблоны) с возможностью вывода через бэк -енд, в настройках навигационного меню или шорткодами:
1. Шаблон регистрационной формы клиента;
2. Шаблон регистрационной формы водителя/курьера;
3. Шаблон формы заказа;
4. Шаблон формы отслеживания.

Фронтенд модуля создания новой заявки должен содержать одностраничную форму заполнения заявки (пример в Приложениях - папка OrderForm-1 ), с автоматическим заполнением полей и регистрацией пользователя при создании новой заявки.

1. Шаблон регистрационной формы клиента
Авторизация Клиента запоминается на срок 5 дней по умолчанию.

Форма регистрации заполняет стандартные строки таблиц для роли "Клиент".

2. Шаблон регистрационной формы водителя/курьера
Авторизация Водителя проверяется через каждые 10 мин.

Если водитель не "онлайн", автоматически изменяется статус водителя на "не в сети".

Форма регистрации заполняет стандартные строки таблиц для роли "Водитель" - UserActivity, UserStatus, UserProperties, CarType

3. Шаблон формы заказа

Поля формы.
Формы и поля формы создаются через бекенд суперадминистратором

Требования по автозаполнению полей формы и расчету билета/заказа:

1. Необходимо автоматическое формирование строки адреса и извлечение данных из нашей БД 

1.0. как в примере -http://plugins.mbcreation.net/woocommerce-google-address-autocomplete/
(в примере: добавте товар в корзину и попробуйте заполнить адрес)

1.1 После полного ручного ввода адресов, на карте должен отображаться маршрут созданный из адресов формы в веб сервисе Гугл Маршруты.

Форма созданная из шорткодов. Описание:
1. HTML5 Табы с формами, на рисунке  активная форма создания заказа
2. Карта с маркерами или маршрутами. если кликнуть первый раз ставится маркер А, если второй маркер Б, рисуется маршрут и заполняются поля адресов.
3. автозаполняемые поля ввода.
4. x-editable поля (редактируются) и поля с результатами расчетов (не редактируются) и кнопка отправки

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

1.2 Строки адресов добавляются пункт А и пункт Б, на основании которых фоормируется данные маршрута (расстояние км. и время поездки) в гугл сервисах (пример - ), после чего отображается в специальной области на карте, если нет маршрута, то стоимость поездки/доставки фиксированая и карта не выводится.

1.3 Форма использует Каталог адресов приложения (навая таблица БД, нет в примерах; т.е. нужно создать такую SQL таблицу) для автоматического извлечения данных, ссылки с которой былы взяты эти данные, описание и геоданные добавляются вручную через бэк-енд 

1.4 Автоматическое извлечение данных из нашего Каталого адресов должно запускаться после перехода пользователем с сайта продажи скидок/товаров добавленного в Каталог адресов по специальной ссылке на этом сайте и в этом случаее поле формы заказа "Пункт А" заполняется автоматически и в коментарии к заказу автоматически добавляется "Доставить {товар} от BeSmart"

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

2. Форма использует все возможные данные авторизованного пользователя для упрощения подачи заявки из БД приложения заполняя их автоматически используя AJAX.

У нас уже есть готовая форма (в Приложениях - папка OrderForm-0)и пожелания к отображению (в Приложениях - папка OrderForm-1)

4. Шаблон формы отслеживания.

Виджет - "Отслеживание", после принятия заказа водителем, должен отображать: 1) текущий статус заявки, 2) Маршрут от пункта А к пункту Б, 3) текущее местоположение водителя который закреплен за заявкой как исполнитель.

Пример виджета -http://codecanyon.net/item/complex-tracking-system-ups-usps-fedex/10601614

Бэкенд модуля "Заказы"

Меню и страницы модуля:

      Заказы -
•	Новый заказ (форма создания)
•	Все заказы (таблица Order)
•	Активные заказы (таблица Order c фильтром заказов по статусу)
•	Архив заказов (таблица Order c фильтром заказов по статусу)
•	Список клиентов
Каталог адресов  -
•	Новый адрес (форма создания)
•	Все адреса (таблица WayPoint)
Транспорт -
•	Новый водитель
•	Все водители  (таблица Users c фильтром по роли)
Клиенты
•	Новый клиент
•	Все клиенты  (таблица Users c фильтром по роли)

Обработка заказов полу-автоматическая, т.е после создания нового заказа клиентом, заказ ожидает модерации менеджера, после чего он передается на исполнение в мобильное приложение водителей по специальному JSON REST протоколу, меняет статус заказа и рассылает PUSH уведомления пользователям вебсервиса. Пример по запросу

Описание таблиц БД модуля "Заказы":

Order – основная таблица которая содержит записи заказов.
•	«addrStart» - пункт назначения А
•	«addrEnd» - пункт назначения Б;
•	«description» - текстовое описание заказа;
•	«dimensions» - габариты посылки;
•	«isTaxi» - определяет к какой категории относится данный тип, имеется 2 категории транспорта – «такси» и «курьер»;
•	«isDelayed» - определяет, является ли заказ «отложенный» или «срочный»;
•	«paymentType» - определяет способ оплаты, 0 = наличные, 1 = безналичные, 2 = по договору;
•	«pending» - определяет статус исполнения заказа, если «правда», то заказ уже закреплен за определенным водителем и не доступен для показа другим водителям, имеет статус «в исполнении», если «ложь», то заказ доступен для аукциона водителям;
•	«points» - маршрут заказа, получаемый от сервиса «Гугл Маршруты»;
•	«pointStart» - пункт А в координатах для веб-сервисов;
•	«pointEnd» - пункт Б в координатах для веб-сервисов;
•	«timeCreated» - дата и время создания заказа;
•	«timestamp» - время в микросекундах после создания заказа, служит для того, чтобы отправить заказ на аукцион повторно если на него не ответил ни один водитель в течении 5 минут;
•	«totalDuration» - прогнозируемое время пути;
•	«totalDistance» - дистанция от пункта А до Б;
•	«totalPrice» - сумма заказа;
•	«timeStart» - дата и время начала заказа, указывается заказчиком;
•	«weight» - вес посылки;
•	«bidWinner» - ссылка на водителя, за которым закреплен заказ;
•	«orderFor» - ссылка на пользователя – получателя;
•	«orderFrom» - ссылка на пользователя – отправителя;
•	«carType» - тип транспорта, закрепленного за заказом;
•	«options» - дополнительные параметры для заказов категории «такси»;
•	«orderstatus» - ссылка на запись статуса отслеживания заказа;
•	«bid» - ссылка на заявки от водителей по текущему заказу;

OrderOptions – содержит различные параметры для заказов такси, доступны для выбора заказчика.

OrderStatus – содержит запись статуса отслеживания заказа;
•	«isPaid» - оплачен заказ или нет, подтверждается водителем;
•	«isArrivedStart» - начало поездки, подтверждается водителем;
•	«isArrivedEnd» - окончание поездки, подтверждается водителем;
•	«user» - водитель, закрепленный за заказом;
•	«order» - непосредственно сам заказ;
•	UserPlan – содержит записи пакетных планов для работы водителей;
•	«bidsMax» - максимально доступное количество заказов для выполнения водителем на указанный период действия пакетного плана;
•	«delay» - задержка получения заказов водителем после их создания, указывается в минутах;
•	«ends» - дата и время окончания действия пакетного плана;
•	«plan» - категория тарифного плана, 0 = Trial, 1 = Moto, 2 = Taxi, 3 = Courier, 4 = VIP;
•	«user» - ссылка на запись водителя;

CarType – служит для создания различных типов транспорта в системе.
•	«isTaxi» - определяет к какой категории относится данный тип, имеется 2 категории транспорта – «такси» и «курьер»;
•	«name» - название типа транспорта;
•	«users» - ссылка на запись пользователя за которым закреплен соответствующий тип;

Bid – содержит заявки водителей на закрепление заказа за водителем.
•	«deviceId» - идентификатор устройства;
•	«won» - если значение = «ПРАВДА», значит за водителем закрепляется соответствующий заказ;
•	«objectId» - уникальный идентификатор записи;
•	«created» - дата и время создания записи;
•	«updated» - дата и время последнего обновления записи;
•	«ownerId» - уникальный идентификатор владельца записи;
•	«driver» - ссылка на запись пользователя, водителя, за которым закрепился заказ;
•	«order» - непосредственно сам заказ, который закреплен.

UserActivity - Реляционные данные истории заказов пользователя;

UserProperties – содержит детальные сведения о водителе.
•	«carModel» - наименование марки автомобиля;
•	«carNumber» - гос. Номер автомобиля;
•	«carColor» - цвет автомобиля;
•	«carSeats» - количество мест в автомобиле;
•	«driverLicense» - дата выдачи водительских прав водителю, отображает общий стаж вождения;
•	«driverBorn» - дата рождения водителя, отображает возраст водителя;
•	«user» - ссылка на запись пользователя – водителя;

Users – содержит записи всех пользователей. Роли пользователей: Client, Driver, Manager.
•	«address» - содержит постоянный адрес пользователя;
•	«isDriver» и «isTaxi» - указывает на категорию пользователя водителя, таксисту не доступны для просмотра заказы для курьера, и на оборот;
•	«mobile» - номер мобильного телефона = логин;
 
UserStatus - содержит запись статуса отслеживания водителя;
•	«lastOnline» - время последней активности в микросекундах, предназначается для автоматического изменения статуса пользователя в положение «не в сети» по истечении 15 минут после того как пользователь закрыл свою программу;
•	«longitude» и «latitude» - последние координаты пользователя, обновляется 1 раз в минуту;
•	«status» - 1 = «свободен», 2 = «в пути», 3 = «аварийный», 4 = «не в сети»;
•	«user» - ссылка на запись пользователя;