Интеграция с RocketWash

Модуль autodealer.integration.rocketwash обеспечивает маппинг между сущностями RocketWash и справочниками AutoDealer, а также высокоуровневые функции создания заказ-нарядов напрямую из данных RocketWash.

Маппинги

Категории автомобилей

RocketWash использует числовой car_type_id, AutoDealer — строковые категории.

RocketWash car_type_id

Категория

Пример авто

36

Кат.01

Седан / хетчбэк

37

Кат.02

Внедорожник / кроссовер

38

Кат.03

Микроавтобус

35

Кат.04

Крупный внедорожник / минивэн

Категории → дерево комплексных работ AutoDealer

Каждой категории соответствует service_complex_work_tree_id в Firebird:

Категория

service_complex_work_tree_id

Кат.01

11

Кат.02

15

Кат.03

16

Кат.04

17

Услуги RocketWash → service_complex_work.name

Маппинг конкретных service_id RocketWash к названиям в справочнике AutoDealer. Услуги без аналога в AutoDealer (Мойка ДВС, Очистка дисков и др.) молча пропускаются при создании заказ-наряда.

Вспомогательные функции (autodealer.integration.rocketwash)

autodealer.integration.rocketwash.resolve_complex_work(rw_service_id, car_type_id=None, car_type=None)

Полный резолв услуги RocketWash в запись service_complex_work АвтоДилера. Ключевая функция для создания заказ-нарядов в «справочном» режиме (с rt_work_id и каноническим именем работы).

Алгоритм:

  1. rw_service_id → канонический name через внутренний маппинг (только для услуг, присутствующих в обеих системах).

  2. car_type_id / car_type → категория через resolve_car_category().

  3. Категория → service_complex_work_tree_id.

  4. В дереве ищется запись с совпадающим name.

Параметры:
  • rw_service_id (int) – services.id из RocketWash.

  • car_type_id (int) – reservations.car_type_id — и актуальный (35/36/37/38), и устаревшие значения (3/27/28/29).

  • car_type (str) – Строка reservations.car_type — fallback, когда car_type_id не в маппинге.

Результат:

Кортеж (service_complex_work_id, name, price) или None.

from autodealer.integration.rocketwash import resolve_complex_work

resolve_complex_work(821459, car_type_id=37)         # → (94, "Стандарт", 1200.0)
resolve_complex_work(821459, car_type_id=27)         # → тот же результат (устаревший id)
resolve_complex_work(821459, car_type="Кат. 2")      # → то же (по строке)
resolve_complex_work(999999, car_type_id=37)         # → None (нет в маппинге)
autodealer.integration.rocketwash.resolve_car_category(car_type_id=None, car_type=None)

Определить категорию АвтоДилера по RW car_type_id и/или строке car_type. Сначала ищет по id, потом fallback через нормализованную строку ("Кат. 2""Кат.02").

Результат:

"Кат.01" / "Кат.02" / "Кат.03" / "Кат.04" или None если не удалось определить.

from autodealer.integration.rocketwash import resolve_car_category

resolve_car_category(27)                 # → "Кат.02"
resolve_car_category(99, "Кат. 2")       # → "Кат.02" (fallback)
resolve_car_category(99, "мусор")        # → None
autodealer.integration.rocketwash.get_car_category_by_type_id(car_type_id)

Возвращает строку категории по car_type_id RocketWash. Старая версия — выбрасывает KeyError на неизвестные id. Для нового кода предпочтительнее resolve_car_category().

Исключение:

KeyError – Если car_type_id неизвестен.

from autodealer.integration.rocketwash import get_car_category_by_type_id

get_car_category_by_type_id(36)   # → "Кат.01"
get_car_category_by_type_id(35)   # → "Кат.04"
autodealer.integration.rocketwash.get_complex_work_tree_id(rocketwash_category)

Возвращает service_complex_work_tree_id AutoDealer для категории RocketWash.

Исключение:

KeyError – Если категория неизвестна.

from autodealer.integration.rocketwash import get_complex_work_tree_id

get_complex_work_tree_id("Кат.01")   # → 11
get_complex_work_tree_id("Кат.04")   # → 17
autodealer.integration.rocketwash.resolve_complex_work_tree_id(rocketwash_category)

То же, что get_complex_work_tree_id(), но возвращает None для неизвестных категорий вместо исключения. Удобно при обработке данных в batch-режиме.

autodealer.integration.rocketwash.map_reservation_services(services_detail)

Маппит список услуг из JSON резервации RocketWash в MappedServiceItem. Услуги без аналога в AutoDealer молча пропускаются.

Параметры:

services_detail (list[dict]) – Распарсенный список из reservations.services_detail. Каждый элемент должен содержать ключи "id", "name", "price", "duration", "count".

Результат:

Список MappedServiceItem.

import json
from autodealer.integration.rocketwash import map_reservation_services

raw = json.loads(reservation_row["services_detail"])
items = map_reservation_services(raw)
for item in items:
    print(item.cw_name, item.price)
autodealer.integration.rocketwash.get_services_for_car_category(car_category, *, db_path=..., exclude_no_price=True)

Загружает все услуги RocketWash с ценами для заданной категории авто из rocketwash.db.

Параметры:
  • car_category (str) – Категория, напр. "Кат.01".

  • db_path (Path) – Путь к rocketwash.db. По умолчанию — ../RocketWash-parser/rocketwash.db.

  • exclude_no_price (bool) – Пропустить услуги без цены (по умолчанию True).

Результат:

Список RocketWashService.

Исключение:

FileNotFoundError – Если rocketwash.db не найден.

from autodealer.integration.rocketwash import get_services_for_car_category

services = get_services_for_car_category("Кат.02")
for s in services:
    print(s.name, s.price)

Типы данных

class autodealer.integration.rocketwash.RocketWashService

Услуга RocketWash с ценой для конкретной категории авто.

service_id: int
name: str
category: str

Категория услуги (напр. "01. МОЙКА и КОМПЛЕКСЫ").

car_type_id: int
car_category: str

Строковая категория авто (напр. "Кат.01").

price: float | None
duration: float | None

Длительность в минутах.

class autodealer.integration.rocketwash.MappedServiceItem

Услуга RocketWash, смаппированная на AutoDealer service_complex_work.

rw_service_id: int
rw_name: str

Оригинальное название в RocketWash.

cw_name: str

Название в service_complex_work AutoDealer.

price: float
duration: float

Длительность в минутах.

count: int