HotelsCasa Partners

Как работает такси

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

Составлено 10 сентября 2026 Источник — код, не документация Движок hc-app
01

Что это за система

HotelsCasa не возит людей. У нас нет ни одной машины, ни одной лицензии и ни одного водителя в штате. Мы — витрина и касса: сводим пассажира с перевозчиком, показываем цену перевозчика закрытой, держим деньги, пока поездка не сделана, и после неё переводим перевозчику его часть.

Из этого следуют три правила, на которых держится вся остальная механика:

  • Мы не ставим цену. Ни одной цифры. Цену пишет флот, который везёт. Если в этом городе ни у кого нет живого тарифа — предложения нет, и это правильный ответ, а не поломка.
  • Таксометра нет. Поездка продаётся закрытой: человек, приземлившийся в чужой стране, хочет знать сумму заранее. Ровно на этой претензии к аэропортовому такси и держится весь рынок трансферов.
  • Машину, которой нет, не обещаем. Если никто не взял заказ — он получает состояние sin_coche, и деньги отпускаются в тот же момент. Это лучше, чем человек в терминале, ждущий машину, которая не приедет.
02

Три роли

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

Пассажир

Аккаунт не нужен. Достаточно имени и мобильного.

  • Говорит, откуда и куда, и видит цену до подтверждения
  • Платит картой — сумма только замораживается
  • Получает номер машины по SMS
  • Следит за подъездом на странице поездки
  • Ставит оценку водителю сразу после поездки

Ему не дают: телефон водителя, его имя, его положение вне поездки, цену флота и нашу комиссию.

Перевозчик

Флот из тридцати машин или таксист с одной — для системы это одно и то же.

  • Пишет свой тариф: посадка, километр, минута, минимум, надбавки
  • Заводит водителей, подтверждает их документы, грузит фото
  • Водитель выходит на линию и принимает заказ за 30 секунд
  • Ведёт поездку до конца и подаёт рапорт о пассажире
  • Видит выплаты по каждой поездке и свою бухгалтерию

Он не может: заблокировать пассажира, изменить цену после подтверждения, увидеть чужие флоты поимённо.

Платформа

Мы. Диспетчерская, касса и модерация.

  • Заводит географию: маршруты «аэропорт → район»
  • Проверяет заявку флота вручную и активирует её
  • Раздаёт заказы автоматически, вручную — только расшивает затор
  • Держит деньги, списывает, переводит, удерживает комиссию
  • Читает рапорты водителей и закрывает дверь пассажиру

Она не делает: не назначает водителя вручную, не рекомендует цену, не хранит ни одного фото документа.

03

Числа, на которых всё держится

Все константы живут в одном месте — lib/taxi.ts. Менять их надо там, а не по экранам.

30 сна ответ водителя, дальше заказ уходит следующему
180 ссрок годности координат: старше — водитель не считается «здесь»
25 кмпредельный радиус подачи
6попыток раздать заказ, потом «машины нет»
300 мна этом расстоянии уходит второй SMS
×1,35крюк: поправка на то, что улицы не по прямой
24 км/чсредняя скорость города для расчёта минут
2SMS на поездку, больше нельзя — съедает комиссию
4фото машины: перёд, зад и два борта
20 %комиссия по умолчанию, у каждого флота своя в карточке
30 миннеоплаченный заказ закрывается сам
7 днживёт заморозка на карте — предел Stripe
5 стакт диспетчерского цикла
2 чживёт ключ страницы поездки после времени подачи
23–06ночь для надбавки
3флота минимум, чтобы показать среднюю по городу
04

Жизнь заказа, шаг за шагом

Слева — состояние в базе (hc2_taxi_pedidos.estado). Цвет точки говорит, кто действует на этом шаге: пассажир, перевозчик, платформа.


витрина

ПассажирНабирает адрес

На витрине /taxi/ он выбирает город из списка (там только города, где есть живой тариф), пишет, откуда забрать, и куда едет. Каждая буква после третьей уходит на /taxi/buscar с задержкой 350 мс — сервер спрашивает Photon (карта OpenStreetMap) и навсегда кладёт ответ в hc2_geo_cache.

Кнопка «моё местоположение» берёт GPS. Если телефон честно сознаётся, что промахивается больше чем на 80 метров, карта открывается сама: булавка приколота к центру, двигают саму карту — одной рукой, с чемоданом, иначе не попасть.


POST /taxi/precio

ПлатформаСчитает цену — на сервере

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

В браузере цена не считается никогда: иначе её можно было бы поправить перед отправкой. Рядом с суммой пассажиру пишут, из чего она сложилась — как на табличке в двери такси.

nuevo

ПассажирПодтверждает и платит

Страница /taxi/pedir/ просит имя, мобильный, время подачи, число мест и багажа. Перед созданием заказа проверяется три вещи: телефон не в чёрном списке, время подачи не в прошлом, и цена совпадает с той, которую человек видел — если флот успел её поменять, показывается новая, и только потом касса.

Заказ рождается в состоянии nuevo с номером вида TX7KQM3P — без нуля, буквы O, единицы и I: этот номер диктуют голосом в шуме терминала.

Не оплатил за полчаса — заказ закрывается сам, чтобы диспетчерская не зарастала призраками.

pagado
pago: retenido

ПассажирДеньги заморожены, не списаны

Stripe Checkout открывается с ручным списанием. На карте блокируется сумма — списания нет. Возврат домой идёт на /taxi/pedir/pagado, и мы не верим адресу: у Stripe спрашивают состояние платежа отдельно. Если человек закрыл вкладку — то же самое сделает вебхук /stripe/hcapp.

Оба пути ведут в одну функцию с условием внутри UPDATE, поэтому заказ не может быть роздан дважды. Здесь же пассажир заводится в справочник по телефону: счётчик поездок +1.

ofertado

ПлатформаИщет машину — по одному

Отбираются водители: активные, в состоянии «свободен», из активного флота, с числом мест не меньше нужного, с координатами свежее трёх минут, не отказавшиеся от этого заказа. Сортировка — по прямому расстоянию до точки подачи, отсекается всё дальше 25 км.

Предлагается строго первому. Не всем сразу — иначе двое примут один заказ, один зря поедет и больше наших заказов не возьмёт. В hc2_taxi_ofertas пишется срок годности предложения, и телефону водителя уходит push.

Если push-адрес мёртв, он тут же стирается, а раздача идёт дальше: 30 секунд всё равно тикают.

aceptado

ПеревозчикВодитель жмёт «Принимаю»

Обе проверки — что предложение живо и что заказ ещё не разобран — сидят внутри одного UPDATE. Двое могут нажать в одну секунду; выигрывает тот, кто первым дошёл до базы, второму говорят, что заказ уже забрали.

В этот момент происходит три вещи: водитель становится «занят», комиссия замораживается в деньгах (не в процентах — чтобы завтрашний пересмотр договора не переписал вчерашние поездки), и пассажиру уходит первый SMS.

0000 ABC

В SMS — только номер машины и имя компании впереди. Ни имени водителя, ни его телефона, ни ссылки: сообщение остаётся в чужом телефоне навсегда, а ссылка в SMS — это то, чем крадут аккаунты.

en_camino

ПеревозчикВыехал

Телефон водителя шлёт координаты каждые 15 секунд, пока он на линии. История не хранится — только «где сейчас»: следить за человеком по городу и записывать это нам не нужно.

На каждой отметке считается расстояние до точки подачи. Ближе 300 метров — уходит второй и последний SMS: тот же номер машины. Что он уже отправлен, проверяется по журналу сообщений, а не по отдельной колонке.

a_bordo

ПеревозчикПассажир сел

Кнопка навигации переключается с точки подачи на точку назначения. Маршрут открывается в его навигаторе: geo: на Android, maps: на iPhone, либо тот, что он выбрал в настройках — Google, Apple, Waze, Yandex. Веб-карта Google прописана в самом теге как последний запасной вариант, на случай если телефон не понял ни одной схемы.

terminado
pago: cobrado

ПеревозчикПоездка закрыта

Водитель снова «свободен». И только теперь замороженное списывается: услуга оказана. Если списать не удалось — карта протухла между заказом и поездкой — заказ у водителя не отбирают, поездка уже сделана; в примечании заказа остаётся запись, по которой это можно взыскать.

Каждый шаг проверяет, откуда он пришёл: дважды нажатая кнопка в зоне плохой связи не закроет поездку, которая не начиналась.

liquidación

ПлатформаДелит деньги

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

Если флот не закончил регистрацию платёжного счёта — проводка встаёт в состояние retenido с написанной причиной, и его панель говорит об этом прямым текстом. Деньги никуда не деваются: они посчитаны и лежат с именем. Как только Stripe сообщит, что счёт готов, всё задержанное уходит само.

valoración

ПассажирСтавит оценку

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

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

parte

ПеревозчикПодаёт рапорт о пассажире

Появляется на экране водителя сразу после закрытия и живёт два часа — позже деталей никто не помнит. Звёзды, причина из списка (агрессия, порча, не явился, грязь, другое) и пара строк.

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

sin_coche

Ветка: машины не нашлось

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

Пассажиру уходит SMS: машины нет, ничего не списано. Если отпустить не удалось — в заказ пишется «ДЕНЬГИ НЕ ОСВОБОЖДЕНЫ», потому что это чужие деньги за ничто, и это надо увидеть.

anulado

Ветка: отменено вручную

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

05

Пассажир: что он видит

Пять экранов, ни одного пароля

ЭкранАдрес (испанская зона)Что там
Витрина/taxi/Форма заказа, три шага «как это работает», вопросы-ответы, список городов. Индексируется.
Подтверждение/taxi/pedir/Цена, кто едет, время подачи, кнопка в кассу. Не индексируется.
Поездка/taxi/viaje/{ключ}Номер машины во весь экран, полоса из четырёх шагов, расстояние до машины, оценка. Обновляется каждые 10 секунд, пока поездка жива.
Безопасность/taxi/seguridad/Что проверяем, что видно в поездке, куда писать. И отдельно — чего у нас пока нет.
Водители города/taxi/conductores/{город}/Публичный список со значком «проверен». Карточка водителя не индексируется.

Ключ страницы поездки

22 случайных символа в адресе. Пароля нет намеренно: человек стоит на тротуаре с чемоданом в одной руке и телефоном в другой. Ключ протухает через два часа после времени подачи — телефон продают, теряют и одалживают, и имя с адресом пассажира не могут открываться с него через год.

Что на этой странице есть и чего нет

  • Есть: номер машины крупно (светлая плашка, тёмные буквы — как настоящий знак), марка машины, обе точки маршрута, расстояние до машины, номер заказа.
  • Нет: имени водителя, его телефона и кнопки «позвонить». Если водитель не находит подъезд — звонит он: телефон пассажира открывается ему в момент принятия заказа.
  • Нет цены флота и нашей комиссии. Пассажир видит только то, что платит.
Чёрный список

Пассажир опознаётся по последним 12 цифрам телефона — единственному, что есть у всех и что и так нужно для SMS. Проверка стоит до кассы: взять деньги и потом отказать — худший из двух способов сказать «нет». Причина отказа на экране не объясняется; кто захочет узнать — напишет, и тогда посмотрит человек.

06

Перевозчик: от заявки до выплаты

Шаг 1. Заявка

Страница /taxi/flotas/, две формы. Первая — для таксиста с одной машиной: имя, мобильный, почта, машина, город, номер лицензии, если в его стране она вообще нужна. Вторая — для компании: плюс налоговый номер и торговый реестр.

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

Заявка ложится в состоянии pendiente и сама не активируется. Между «записался» и «получает пассажиров» стоит наш человек с лицензией перед глазами. Уходят два письма: подтверждение заявителю и уведомление на [email protected].

Шаг 2. Вход

Отдельного пароля у такси нет — общая дверь сайта, вход по коду на телефон. Карточка флота и учётная запись склеиваются сами: флот — по почте, которую он написал в заявке; водитель — по последним девяти цифрам телефона, который вбил его начальник. Поэтому «600 12 34 56» у начальника и «+34 600 123 456» у водителя — это один человек.

Шаг 3. Гараж

Восемь сворачивающихся блоков на /taxi/garaje/. Тот, у кого флота ещё нет, видит тот же гараж в виде образца — с пустой карточкой, подсказками к каждому полю и приглашением записаться. Витрину показывают, а не запирают: кто увидел, что получит, — записывается.

БлокЧто делает
ДеньгиТри цифры за 30 дней: выставлено, наша комиссия, к выплате. Плюс «в работе прямо сейчас» — ещё не его деньги, но снимает звонок «а сегодняшнее?».
ВыплатыСтрока на поездку: сколько заплатил пассажир, сколько взяли мы, сколько ушло на счёт, дата. Задержанное — сверху, с причиной и кнопкой «попробовать сейчас».
Бухгалтерия машиныВыручка и километры берём мы. Он вписывает расходы. Топливо считается по расходу на 100 км, если он один раз сказал, сколько ест машина и почём заправляет. Износ — «сколько стоит машина на километр». На выходе — чистый евро за километр и точка безубыточности в километрах и поездках.
Приём денегStripe Connect Express. Наша база хранит только идентификатор счёта и флаг «может принимать». Ни счёта в банке, ни налоговых данных у нас нет.
Проверка правStripe Identity: фото прав плюс селфи с живым захватом. Фото через нас не проходит — приходит только вердикт. Кнопка появляется, лишь когда карточка водителя заполнена целиком: каждая попытка стоит денег, и от любопытства платить не будем.
ВодителиИмя, телефон, машина, номер, места, лицензия. Фото лица, четыре фото машины, отметка «документы проверены» и снятие с линии. Есть вставка списком из таблицы — компания с тридцатью машинами не заводит их по одному; непонятые строки возвращаются текстом, а не проглатываются молча.
Тариф городаПосадка, километр, минута, минимум, ночная и пиковая надбавка, отдельные цифры для большой машины, валюта из списка. Рядом — живой пересчёт «5 км, 12 минут = столько», и ориентир: сколько в среднем берут другие компании этого города (минимум две, своя не считается).
Трансферы аэропортаСписок маршрутов заводим мы — это география. Цену каждого пишет он. Пустая цена или ноль означает «этот маршрут не делаю», и маршрут гасится.
Почему документы проверяет флот, а не мы

Права, страховку и техпаспорт компания и так держит перед глазами: это её обязанность по закону и её риск. Мы храним отметку и дату — и ни одной фотографии документа. Архив водительских удостоверений — ровно то, чего не хочется иметь в тот день, когда в базу кто-то залезет.

Шаг 4. Экран водителя

Адрес /taxi/conductor/. Это не страница, это инструмент. Ни шапки, ни меню, ни подвала, ни баннера про cookies: смотрят на него краем глаза за рулём, и открывается он с мобильной сети, иногда на подземной парковке терминала.

Ставится из браузера на домашний экран — ни App Store, ни Google Play, ни трёх дней на одобрение правки. Манифест плюс service worker; кэша нет вовсе: протухшая поездка из кэша хуже пустого экрана — водитель поедет за тем, кто уже отменил.

  • Переключатель «на линии». Выключил — координаты стираются, иначе раздача будет считать его «где-то рядом», пока точка не протухнет сама.
  • Экран предложения. Крупно: сумма, обратный отсчёт, оценка пассажира и число его поездок, расстояние до него, длина поездки, места, багаж, рейс. Кнопки «Принять» и «Пропустить» разнесены намеренно.
  • Отсчёт на экране — честное украшение. Он рисуется по сроку, который выдал сервер, и стартует с того, что осталось на самом деле: если открыл приложение на двадцатой секунде, часы не будут врать про тридцать. Решает всегда база.
  • Пропустить можно без последствий. Никаких штрафов и вопросов «почему»: заказ уходит следующему немедленно, не дожидаясь тридцати секунд. Быстрое «нет» — услуга нам.
  • Push приходит пустым. Внутри уведомления нет ничего: service worker получает толчок и сам спрашивает сервер под сессией водителя. Данные пассажира не идут через чужой push-сервер.
  • Опрос дублирует push. Пока экран открыт, приложение само спрашивает сервер каждые 5 секунд: у части телефонов push задушен энергосбережением.
07

Платформа: диспетчерская и часы

Диспетчерская

Единственный экран такси, сделанный под монитор: всё остальное — телефонное, потому что телефонные и пассажир, и водитель, и хозяин флота. Тому, кто смотрит за службой, нужно много строк сразу.

Не администратор получает 404, а не «доступ запрещён»: страницы, которой нет, никто не ищет. Обновляется сама каждые 15 секунд.

Она не раздаёт заказы. Раздаёт система; ручное назначение — это возвращение того самого диспетчера, которого мы и убрали. Здесь смотрят и расшивают затор.

ТаблицаДействия
Живые поездки (до 60)«Повторить» для застрявших без машины, «Отменить» для любых
Водители (до 100)Только смотреть: состояние, когда виден в последний раз, точка на карте
Фиксированные маршруты (до 200)Добавить маршрут (город, откуда, куда, центр, радиус, минуты), снять с линии
Рапорты водителей«Заблокировать» пассажира с записанной причиной, «В архив»
Заблокированные«Разблокировать»
Маршрут снимают, а не удаляют

Тарифы, которые флоты уже на него написали, и сделанные по нему поездки продолжают на него ссылаться. То же с водителем: снятый с линии не стирается — его поездки остаются записанными на его имя.

Часы: что крутится само

каждые 5 с
Просроченные предложения помечаются истёкшими, и заказ уходит следующему водителю. Время считает сервер, а не телефон: потеря связи на полминуты не должна вешать поездку на того, кто её и не видел.
там же
Заказы, которые родились и не были оплачены, через полчаса закрываются.
по вебхуку
Оплата, о которой мы не узнали (закрыл вкладку). И событие «флот дозаполнил платёжный счёт»: всё задержанное по нему выплачивается само.

Что платформа знает о пассажире

Одна строка на телефон: имя, число поездок, средняя оценка от водителей, состояние (normal, vigilado, bloqueado) и записанная причина. Рапорт с указанной причиной сам переводит человека в «под наблюдением» — но не в «заблокирован».

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

08

Как считается цена

Два пути, именно в таком порядке

1. Фиксированный трансфер. Если точка назначения попала в круг зоны с написанной ценой — правит эта цена. Флот поставил её ровно за этот маршрут, и пробки её не двигают.

2. Поездка по городу. Если никуда не попала — считается по тарифу города:

цена = посадка + км × цена_км + минуты × цена_мин
если ночь (23:00–06:00) или час пик → цена × (1 + надбавка / 100)
если цена меньше минимума → цена = минимум

км = прямое расстояние × 1,35  (улицы не по прямой)
минуты = км / 24 км/ч × 60, но не меньше 5

От пяти пассажиров берутся цифры большой машины; не заполнил их флот — предложения нет вовсе. Шестерых не сажают в легковую, даже если так дешевле.

Расстояние меряется по прямой с поправкой, и поэтому цена показывается закрытой: если оценка не дотянула, разницу кладёт дом, а не пассажир. Настоящая маршрутизация — это платные карты и лишний вызов на каждый заказ; появится объём — меняется в одном месте.

Из нескольких флот показывается самая дешёвая живая цена — так же, как в отелях.

Валюта выбирается, а не пишется

32 валюты списком: Европа, Турция, постсоветское пространство, Южная Америка плюс доллар. Свободное поле из трёх букв кончается тем, что кто-то пишет «евро», «€» или «динар», и цена этого флота не сравнивается и не списывается — Stripe работает с кодом, а не с тем, что кому-то показалось. Динары, посчитанные как евро, нам уже стоили клиента.

09

Деньги: полный маршрут одной суммы

Заморозка
Пассажир подтверждает — сумма блокируется на карте. Никто ничего ещё не получил, и никто ничего не потерял.
Заморозка комиссии
В момент принятия заказа. Процент флота превращается в сумму в валюте и записывается в заказ. Пересмотр договора завтра не переписывает вчера — цифра, которая сама меняется в чужом отчёте, это конец доверия.
Списание
Когда водитель закрыл поездку. Не раньше: до этого момента услуга не оказана и деньги чужие.
Перевод
Сразу за списанием: сумма минус комиссия уходит на счёт флота отдельным переводом с меткой поездки. Единственность гарантирует уникальный ключ в нашей таблице, а не платёжная система.
Задержка
Счёт флота не готов — проводка встаёт как retenido с причиной. Панель показывает сумму и что именно доделать. Уходит само, как только придёт сигнал «готов».
Отпускание
Машины не нашлось — заморозка снимается, деньги на карте свободны в ту же секунду. Возврат (медленный и с комиссией) остаётся только для уже списанных сумм.
Почему перевод, а не разделённый платёж

В момент оплаты ещё не известно, кто повезёт: заказ предлагается уже после. Разделить платёж можно, только зная получателя, — а его нет. Поэтому деньги приходят к нам и уходят к флоту, когда поездка сделана.

Почему из этого следует «сначала посмотреть, потом взять»

Обещание на витрине — «сейчас только заморозка, списание после поездки, машины нет — отпускаем целиком» — не маркетинг, а точное описание того, что делает код. Именно поэтому в вопросах-ответах оно написано отдельным пунктом.

10

Языки и адреса

Восемь зон, ни одной больше. Язык живёт в адресе и больше нигде: заголовок браузера не смотрится вовсе. Кто пришёл по испанской ссылке — читает по-испански, даже если его телефон французский и он во Франции.

ЗонаВитринаЗаказПеревозчикам
es/taxi//taxi/pedir//taxi/flotas/
en/en/taxi//en/taxi/book//en/taxi/fleets/
de/de/taxi//de/taxi/bestellen//de/taxi/flotten/
fr/fr/taxi//fr/taxi/reserver//fr/taxi/flottes/
it/it/taxi//it/taxi/prenota//it/taxi/flotte/
pt/pt/taxi//pt/taxi/reservar//pt/taxi/frotas/
tr/tr/taksi//tr/taksi/siparis//tr/taksi/filolar/
ru/ru/taksi//ru/taksi/zakaz//ru/taksi/parki/

Так же по восемь адресов у страницы безопасности (/ru/taksi/bezopasnost/) и у списка водителей (/ru/taksi/voditeli/).

Ловушка испанского слова и как она закрыта

Рамка сайта дописывает язык к ссылкам как они написаны, а в меню написано /taxi/. С русской страницы это давало /ru/taxi/, которого не существует — русский адрес /ru/taksi/. Кнопка «Такси» в меню отдавала 404 в двух зонах: русской и турецкой, где слово не похоже на испанское.

Гоняться за конкретной ссылкой бессмысленно — завтра родится другая, написанная так же. Поэтому испанская форма с приставкой принимается и отдаёт 301 на правильный адрес: заодно чинится то, что кто-то уже скопировал или сохранил.

Без языка — четыре адреса

  • /taxi/garaje/, /taxi/conductor/, /taxi/despacho/ — рабочие экраны того, кто уже вошёл. Внесены в список исключений рамки: приставка языка сделала бы из них 404.
  • /taxi/viaje/{ключ} — одна страница на все восемь языков. Язык берётся из самого заказа, из того, на каком языке его сделали.

Как переводится текст

Каждая фраза экрана прогоняется через словарь. Нет в словаре — фраза встаёт в очередь фабрики переводов, а на экране пока остаётся испанский. Поэтому свежая фраза какое-то время видна по-испански — это очередь, а не поломка.

Переводится только текст: содержимое тегов и те атрибуты, которые читает человек. Ни классы, ни адреса, ни код скриптов не трогаются — на этом уже обжигались, когда словарное «pos» превратило lc-comm-post в сломанный класс.

11

Где что лежит

Восемнадцать таблиц. Все с приставкой hc2_ — то есть наши, не WordPress.

ТаблицаЧто хранитКлючевое
hc2_taxi_flotasПеревозчикиСостояние, комиссия, счёт для выплат и флаг готовности
hc2_taxi_conductoresВодителиМесто, номер, положение и время отметки, push, проверка личности, фото машины списком
hc2_taxi_zonasФиксированные маршрутыЦентр и радиус зоны назначения, минуты
hc2_taxi_tarifasЦена флота за маршрутУникально по паре флот и маршрут
hc2_taxi_tarifas_ciudadЦена флота за городПосадка, км, минута, минимум, надбавки, большая машина
hc2_taxi_pedidosЗаказыДевять состояний, четыре состояния оплаты, ключ страницы поездки
hc2_taxi_ofertasПредложения водителямСрок годности, расстояние в метрах, ответ
hc2_taxi_liquidacionesВыплатыОдна на поездку, уникальный ключ — защита от двойного перевода
hc2_taxi_valoracionesОценки пассажировОдна на поездку
hc2_taxi_partesРапорты водителейОдин на поездку, причина из списка
hc2_taxi_pasajerosСправочник пассажировПо телефону; состояние и причина
hc2_taxi_gastosРасходы перевозчикаДесять категорий, отметка «ежемесячный»
hc2_taxi_coste_cocheПаспорт машиныЦена, остаточная стоимость, срок, пробег, расход, цена топлива
hc2_taxi_avisosНапоминанияСтраховка, техосмотр, ТО, лицензия — по дате и по пробегу
hc2_geo_cacheНайденные адресаБез срока: улица не переезжает
hc_message_logЖурнал SMSПо нему же проверяется, не ушёл ли уже второй SMS

Ещё две — hc2_taxi_docs и hc2_taxi_solicitudes — созданы первой миграцией и сейчас не используются ни одним экраном.

12

Что система не делает — намеренно

Написано здесь, чтобы никто не рассчитывал. То же самое сказано пассажиру на странице безопасности, отдельным разделом «чего у нас пока нет».

  • Нет тревожной кнопки в поездке.
  • Нет кода посадки.
  • Пассажир не может позвонить водителю — только водитель пассажиру.
  • Нет режима демонстрации. Он был и удалён целиком: путь, который раздаёт поездки без оплаты, — ровно то, что нельзя забыть в системе с деньгами. Фильтр против флот с пометкой DEMO остался страховочной сеткой, без выключателя: даже администратор их не увидит.
  • Нет ручного назначения водителя.
  • Нет наличных. Внутри машины о деньгах не разговаривают.
  • Нет своей карты в приложении водителя. У него уже есть навигатор, и учить второй он не будет.
  • Нет истории перемещений. Только «где сейчас».
  • Нет ни одного фото документа ни в базе, ни на диске.
Отдельно: расхождения кода и обещаний

Этот документ описывает как есть, а не как задумано. Места, где экран обещает больше, чем делает движок, — а такие есть, и часть из них ломает поездку, — вынесены в отдельный разбор от 10 сентября 2026: раздача заказов не смотрит на верификацию водителя, время подачи не влияет ни на что, у фиксированного трансфера точка подачи совпадает с точкой назначения, а цену ставит одна флота, тогда как везёт другая.