Домен: Документы / Заказ-наряды¶
Создание и чтение заказ-нарядов (document_out) и связанных цепочек записей.
—
Схема связей¶
document_out (document_type_id=11, client_id, summa=0, flag=2, date_accept)
│
├── service_work × N ← строки услуг (см. два режима ниже)
│
├── document_cargo ← плательщик документа (payer_id = client_id)
│
└── document_registry ← метазапись (аудит: кто создал, когда)
│
└── document_out_header (номер, дата, prefix="АВТ", state=2)
│
└── document_service_detail ← привязка авто (обязательно)
—
ORM-модели¶
DocumentOut¶
Таблица document_out — основная запись документа.
Поле |
Тип |
Описание |
|---|---|---|
|
|
Первичный ключ; возвращается из |
|
|
Тип документа (11=Заказ-наряд) |
|
|
Клиент |
|
|
Организация-исполнитель |
|
|
Сумма товаров, не общая. |
|
|
Константа |
|
|
Бонусы к начислению (дефолт 0). |
|
|
Дата/время приёма / окончания работ |
|
|
Дата оплаты (обновляется при |
DocumentRegistry¶
Таблица document_registry — метазапись для каждого документа (аудит + связь с платежами).
Поле |
Тип |
Описание |
|---|---|---|
|
|
Первичный ключ |
|
|
Тип сущности (12=document_out) |
|
|
Кто создал |
|
|
Когда создал |
|
|
Кто изменил последним |
|
|
Когда изменил |
|
|
Кэш типа документа |
DocumentOutHeader¶
Таблица document_out_header — заголовок документа (номер, дата, исполнитель).
Поле |
Тип |
Описание |
|---|---|---|
|
|
Первичный ключ |
|
|
Ссылка на |
|
|
Ссылка на |
|
|
Папка документов |
|
|
Исполнитель |
|
|
Префикс номера ( |
|
|
Порядковый номер |
|
|
Суффикс номера (напр. |
|
|
Вычисляемое поле: |
|
|
Дата создания документа |
|
|
Статус: 2=Черновик, 4=Оформлен, -1=Удалён |
|
|
Примечание |
DocumentServiceDetail¶
Таблица document_service_detail — деталь услуги: привязка авто + сумма работ.
Создаётся всегда; client_car у create_service_order() —
обязательный параметр.
Поле |
Тип |
Описание |
|---|---|---|
|
|
Первичный ключ |
|
|
Заголовок документа |
|
|
Привязка авто клиента ( |
|
|
Сумма услуг. UI прибавляет к |
|
|
Норма цены, у всех ручных = |
|
|
Скидка на работы (дефолт 0). |
|
|
Бонусы за работу (дефолт 0). |
|
|
Константа |
|
|
Текст гарантии (стандартный шаблон). |
DocumentCargo¶
Таблица document_cargo — реквизиты плательщика документа (не про груз,
несмотря на имя). У всех ручных заказ-нарядов АвтоМойки заполнена;
create_service_order создаёт её автоматически.
Поле |
Тип |
Описание |
|---|---|---|
|
|
Первичный ключ |
|
|
Документ |
|
|
Плательщик ( |
|
|
Флаги актуализации реквизитов (константно = |
|
|
Использовать основной способ оплаты (константно = |
ServiceWork¶
Таблица service_work — строки услуг в заказ-наряде. Существует два
режима записи: справочный (привязка к service_complex_work) и
ручной. Выбор определяется наличием complex_work_id в
ServiceOrderItem.
Поле |
Тип |
Описание |
|---|---|---|
|
|
Первичный ключ |
|
|
Заказ-наряд |
|
|
Справочный режим: каноническое имя ( |
|
|
Справочный режим: цена за единицу.
Ручной режим: |
|
|
Справочный режим: |
|
|
Множитель для UI-расчёта итога. Всегда |
|
|
FK в справочник работ. При |
|
|
Тип справочника: |
|
|
Количество (по умолчанию 1) |
|
|
Порядок строки |
|
|
Внешний ID (напр. из RocketWash — |
DocumentOutTree¶
Таблица document_out_tree — иерархия папок для документов реализации.
from autodealer.domain.document_out_tree import DocumentOutTree
folders = DocumentOutTree.objects.filter(hidden=0).all()
# document_out_tree_id=3 → «АвтоМойка»
—
Высокоуровневые функции (services)¶
create_service_order¶
- autodealer.services.create_service_order(*, client_id, items, document_out_tree_id, organization_id, client_car, date_start, date_finish, created_by_user_id=1, notes=None, service_order_suffix=None)¶
Создать заказ-наряд. Все записи — в одной транзакции.
- Параметры:
client_id (int) – PK клиента.
items (list[ServiceOrderItem]) – Строки услуг. Не может быть пустым.
document_out_tree_id (int) – Папка документов.
organization_id (int) – Организация-исполнитель.
client_car (int) –
model_link_id— обязателен. ПриNoneфункция выбрасываетValueError.date_start (datetime) – Дата начала.
date_finish (datetime) – Дата окончания / приёма.
created_by_user_id (int) – Исполнитель (по умолчанию 1).
notes (str) – Примечание.
service_order_suffix (str) – Суффикс номера (напр.
"К").
- Результат:
document_out_id.- Тип результата:
int
- Исключение:
ValueError – Если
itemsпустой илиclient_carне передан.
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"), ], )
delete_service_order / restore_service_order¶
- autodealer.services.delete_service_order(document_out_id, *, hard=False)¶
Удалить заказ-наряд.
Soft (
hard=False, по умолчанию): ставитdocument_out_header.state = -1(«Удалён»). Документ скрывается в UI АвтоДилера, но данные сохраняются.Hard (
hard=True): физически удаляет всю цепочку записей в одной транзакции —document_cargo→service_work→document_service_detail→document_out_header→document_registry→document_out. Перед этим авто-удаляются «ботовые» платежи (с маркеромBOT_NOTE_MARKERвpayment.notes). Если на документе есть ручные платежи — функция выбрасываетValueError.
- Исключение:
ValueError – Документ не найден; при
hard=True— привязаны ручные платежи.
- autodealer.services.restore_service_order(document_out_id, *, state=2)¶
Парная операция к soft-delete. Переводит
document_out_header.stateиз-1обратно в рабочее (по умолчанию2— «Черновик»). Отказывает, если текущий state ≠-1, чтобы не понизить/повысить state живого документа.
get_service_order¶
- autodealer.services.get_service_order(document_out_id)¶
Прочитать заказ-наряд со строками услуг.
- Результат:
ServiceOrderилиNone.
order = get_service_order(42) print(order.summa, order.date_accept) for item in order.items: print(item.name, item.price)
- class autodealer.services.ServiceOrderItem¶
Одна строка услуги в заказ-наряде. Два режима записи в
service_work(см. ServiceWork выше):- name: str
Имя работы. В справочном режиме — каноническое из
service_complex_work.name("Стандарт","Комплекс").
- price: float
Цена за единицу. Попадает в
service_work.price(справочный режим) илиservice_work.time_value(ручной режим).
- time_value: float
Длительность (минуты). Справочная информация, в БД не сохраняется — в
service_workнет отдельного поля под длительность.
- quantity: int = 1
- external_id: str | None
Напр.
"821459"—services.idиз RocketWash.
- complex_work_id: int | None = None
PK в
service_complex_work. Если задан — включает «справочный» режим записи:rt_work_id = complex_work_id,work_source = 3. Ищется черезautodealer.integration.rocketwash.resolve_complex_work().
- 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
- client_car: int | None
- items: list[ServiceOrderItem]
—
Константы¶
Константа |
Значение |
Описание |
|---|---|---|
|
|
Заказ-наряд |
|
|
Префикс номера |
|
|
Статус при создании |
|
|
|