130 lines
5.1 KiB
Python
130 lines
5.1 KiB
Python
# -*- coding: utf-8 -*-
|
||
# hub/ticket/ui/pages/archive_view_helpers.py
|
||
|
||
"""Вспомогательные функции построения представления архива."""
|
||
|
||
from __future__ import annotations
|
||
|
||
from domain import ArchiveRecordSnapshot, TicketDocumentSnapshot, TicketTaskSnapshot
|
||
from domain.ticket_constants import STATE_REFUSED, TICKET_STATE_COLORS, TICKET_STATE_NAMES
|
||
from ui.task_view_formatters import format_datetime, split_task_location
|
||
|
||
|
||
def record_to_task_snapshot(record: ArchiveRecordSnapshot) -> TicketTaskSnapshot:
|
||
"""Построить синтетический TicketTaskSnapshot для отрисовки карточки."""
|
||
state_code = record.pre_archive_state_code
|
||
return TicketTaskSnapshot(
|
||
task_id=record.task_id,
|
||
location=record.location,
|
||
state_code=state_code,
|
||
state_name=TICKET_STATE_NAMES.get(state_code, "Архив"),
|
||
action_text=record.action_text,
|
||
color_hex=TICKET_STATE_COLORS.get(state_code, record.color_hex),
|
||
created_at=record.created_at,
|
||
completed_at=record.completed_at,
|
||
refused_from_state=record.refused_from_state,
|
||
refusal_reason=record.refusal_reason,
|
||
assigned_specialist=record.assigned_specialist,
|
||
specialist_photo=record.specialist_photo,
|
||
diagnostic_report_signed=record.diagnostic_report_signed,
|
||
repair_report_signed=record.repair_report_signed,
|
||
acceptance_report_signed=record.acceptance_report_signed,
|
||
sequence_number=record.sequence_number,
|
||
)
|
||
|
||
|
||
def cycle_token_from_record(record: ArchiveRecordSnapshot) -> str:
|
||
"""Получить cycle_token из created_at архивной записи."""
|
||
if record.created_at is not None:
|
||
return record.created_at.strftime("%Y%m%d_%H%M%S")
|
||
return ""
|
||
|
||
|
||
def build_preview_lines(
|
||
record: ArchiveRecordSnapshot,
|
||
documents: list[TicketDocumentSnapshot],
|
||
) -> list[str]:
|
||
"""Собрать текст предпросмотра архивной записи."""
|
||
institution, device, room = split_task_location(record.location)
|
||
is_refused = record.pre_archive_state_code == STATE_REFUSED
|
||
|
||
lines: list[str] = []
|
||
seq = record.sequence_number or record.task_id
|
||
lines.append(f"Задача #{seq}")
|
||
lines.append(f"Статус: {record.pre_archive_state_name}")
|
||
lines.append("")
|
||
|
||
lines.append(f"Учреждение: {institution}")
|
||
lines.append(f"Оборудование: {device}")
|
||
lines.append(f"Кабинет: {room}")
|
||
lines.append("")
|
||
|
||
lines.append(f"Создана: {format_datetime(record.created_at)}")
|
||
if record.completed_at is not None:
|
||
label = "Отказано" if is_refused else "Завершена"
|
||
lines.append(f"{label}: {format_datetime(record.completed_at)}")
|
||
lines.append(f"Архивирована: {format_datetime(record.archived_at)}")
|
||
lines.append("")
|
||
|
||
lines.append("─── Ход работ ───")
|
||
lines.append("")
|
||
|
||
specialist = record.assigned_specialist.strip()
|
||
lines.append(f"Специалист: {specialist or 'Не назначен'}")
|
||
lines.append(
|
||
f"Диагностика: {'Подписан' if record.diagnostic_report_signed else 'Не подписан'}"
|
||
)
|
||
lines.append(
|
||
f"Ремонт: {'Подписан' if record.repair_report_signed else 'Не подписан'}"
|
||
)
|
||
lines.append(
|
||
f"Приёмка: {'Подписан' if record.acceptance_report_signed else 'Не подписан'}"
|
||
)
|
||
lines.append("")
|
||
|
||
if is_refused and record.refusal_reason:
|
||
lines.append("─── Причина отказа ───")
|
||
lines.append("")
|
||
lines.append(record.refusal_reason)
|
||
lines.append("")
|
||
|
||
if documents:
|
||
for doc in documents:
|
||
_append_document_block(lines, doc)
|
||
|
||
return lines
|
||
|
||
|
||
_BASE_PAYLOAD_KEYS = frozenset({
|
||
"task_id", "institution", "room", "device", "location", "specialist",
|
||
})
|
||
|
||
_PAYLOAD_KEY_LABELS: dict[str, str] = {
|
||
"initial_cause": "Первичное заключение",
|
||
"actual_cause": "Вторичное заключение",
|
||
"work_done": "Выполненные работы",
|
||
"used_parts": "Использованные запчасти",
|
||
"recommendations": "Рекомендации",
|
||
"work_description": "Описание работ",
|
||
"executor_signature": "Исполнитель",
|
||
"customer_signature": "Заказчик",
|
||
}
|
||
|
||
|
||
def _append_document_block(
|
||
lines: list[str], doc: TicketDocumentSnapshot,
|
||
) -> None:
|
||
"""Добавить блок документа без дублирования данных заголовка записи."""
|
||
doc_date = format_datetime(doc.created_at)
|
||
lines.append(f"─── {doc.title} ({doc_date}) ───")
|
||
lines.append("")
|
||
if doc.payload:
|
||
for key, value in doc.payload.items():
|
||
if not value or key in _BASE_PAYLOAD_KEYS:
|
||
continue
|
||
label = _PAYLOAD_KEY_LABELS.get(key, key)
|
||
lines.append(f"{label}: {value}")
|
||
elif doc.summary:
|
||
lines.append(doc.summary)
|
||
lines.append("")
|