Заказ-наряды (autodealer.services)

Высокоуровневые функции для работы с заказ-нарядами. Каждая функция выполняет несколько INSERT-ов в одной транзакции — при ошибке полный rollback.

Создание заказ-наряда

autodealer.services.create_service_order(*, client_id, items, document_out_tree_id, organization_id, client_car=None, date_start, date_finish, created_by_user_id=1, notes=None, service_order_suffix=None)

Создать заказ-наряд с услугами для клиента.

Цепочка записей в БД:

document_out
    ↓
document_registry
    ↓
document_out_header  (prefix="АВТ", state=2 «Черновик»)
    ↓
document_service_detail  — только если передан client_car
    ↓
service_work × N    — по одной записи на каждый ServiceOrderItem
Параметры:
  • client_id (int) – PK клиента (client.client_id).

  • items (list) – Список ServiceOrderItem. Не может быть пустым.

  • document_out_tree_id (int) – FK папки документов (document_out_tree).

  • organization_id (int) – FK организации-исполнителя.

  • client_car (int) – model_link.model_link_id — привязка авто (опционально).

  • date_start (datetime) – Дата/время начала (document_registry).

  • date_finish (datetime) – Дата/время окончания (document_out.date_accept, document_out_header.date_create).

  • created_by_user_id (int) – users.user_id исполнителя. По умолчанию 1.

  • notes (str) – Примечание к заказ-наряду.

  • service_order_suffix (str) – Суффикс номера (напр. "К"). Префикс всегда "АВТ".

Результат:

document_out_id созданного заказ-наряда.

Тип результата:

int

Исключение:
  • ValueError – Если items пустой.

  • sqlalchemy.exc.DatabaseError – При FK-нарушении.

from datetime import datetime, timedelta
from autodealer.services import create_service_order, ServiceOrderItem

now = datetime.now()
doc_id = create_service_order(
    client_id=920,
    organization_id=1,
    document_out_tree_id=3,
    date_start=now,
    date_finish=now + timedelta(hours=1),
    client_car=959,
    notes="Комплексная мойка",
    service_order_suffix="К",
    items=[
        ServiceOrderItem("Комплекс",    price=2300.0, time_value=90, external_id="821460"),
        ServiceOrderItem("Вторая Фаза", price=800.0,  time_value=20, external_id="821462"),
    ],
)
print(doc_id)  # → document_out_id
class autodealer.services.ServiceOrderItem

Строка услуги в заказ-наряде.

name: str

Название работы (макс. 255 символов).

price: float

Цена за единицу.

time_value: float

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

quantity: int

Количество. По умолчанию 1.

external_id: str | None

Внешний ID (напр. "821460" из RocketWash).

Чтение заказ-наряда

autodealer.services.get_service_order(document_out_id)

Загрузить заказ-наряд со всеми строками услуг.

Параметры:

document_out_id (int) – PK документа.

Результат:

ServiceOrder или None если не найден.

from autodealer.services import get_service_order

order = get_service_order(42)
print(order.summa, order.date_accept)
for item in order.items:
    print(item.name, item.price)
class autodealer.services.ServiceOrder

Агрегат заказ-наряда.

document_out_id: int
client_id: int | None
summa: float
date_accept: datetime | None
date_payment: datetime | None
document_number: int | None
date_create: datetime | None
client_car: int | None

model_link_id привязанного авто.

items: list[ServiceOrderItem]

Создание из RocketWash

См. страницу Интеграция с RocketWash.

Константы

Константа

Значение

Описание

_DOCUMENT_TYPE_SERVICE_ORDER

11

Тип документа «Заказ-наряд»

_SERVICE_ORDER_PREFIX

"АВТ"

Префикс номера документа

_DOCUMENT_STATE["Черновик"]

2

Статус при создании

_METATABLE_DOCUMENT_OUT

12

document_registry.metatable_id