Add Dispatch_V0.1.1

This commit is contained in:
2026-04-29 08:18:54 +04:00
commit a7ede6ded4
404 changed files with 39167 additions and 0 deletions

View File

@@ -0,0 +1,135 @@
# -*- coding: utf-8 -*-
# hub/ticket/ui/details/task_details_actions.py
"""Отдельный модуль действий экрана деталей Ticket."""
from __future__ import annotations
from application.ticket_application_api import TicketApplicationApi
from domain import TicketDocumentSnapshot, TicketTaskSnapshot
from ui.dialogs import (
AcceptanceDialog,
DiagnosticReportDialog,
RepairReportDialog,
SpecialistDialog,
TaskRefusalDialog,
)
from ui.ticket_message_dialog import TicketMessageDialog
class TaskDetailsActions:
"""Обёртка над application-командами для details-экрана."""
def __init__(self, application: TicketApplicationApi):
self._application = application
def assign_specialist(
self,
task: TicketTaskSnapshot,
parent=None,
) -> TicketTaskSnapshot | None:
dialog = SpecialistDialog(
specialists=self._application.list_specialists(),
parent=parent,
)
if dialog.exec() != dialog.DialogCode.Accepted:
return None
specialist_name = dialog.selected_specialist.strip()
if not specialist_name:
self._show_warning(parent, "Имя специалиста не указано.")
return None
snapshot = self._application.assign_specialist(task.task_id, specialist_name)
if snapshot is None:
self._show_warning(parent, "Не удалось назначить специалиста.")
return snapshot
def sign_diagnostic(
self,
task: TicketTaskSnapshot,
parent=None,
) -> TicketDocumentSnapshot | None:
dialog = DiagnosticReportDialog(task, parent=parent)
if dialog.exec() != dialog.DialogCode.Accepted:
return None
try:
return self._application.create_diagnostic_report(
task.task_id,
**dialog.build_payload(),
)
except ValueError as exc:
self._show_warning(parent, str(exc))
return None
def sign_repair(
self,
task: TicketTaskSnapshot,
parent=None,
) -> TicketDocumentSnapshot | None:
dialog = RepairReportDialog(task, parent=parent)
if dialog.exec() != dialog.DialogCode.Accepted:
return None
try:
return self._application.create_repair_report(
task.task_id,
**dialog.build_payload(),
)
except ValueError as exc:
self._show_warning(parent, str(exc))
return None
def sign_acceptance(
self,
task: TicketTaskSnapshot,
parent=None,
) -> TicketDocumentSnapshot | None:
dialog = AcceptanceDialog(task, parent=parent)
if dialog.exec() != dialog.DialogCode.Accepted:
return None
try:
return self._application.create_acceptance_report(
task.task_id,
**dialog.build_payload(),
)
except ValueError as exc:
self._show_warning(parent, str(exc))
return None
def archive_task(
self,
task: TicketTaskSnapshot,
parent=None,
) -> TicketTaskSnapshot | None:
answer = TicketMessageDialog.ask_confirmation(
parent=parent,
title="Архивация задачи",
message=f"Переместить задачу #{task.sequence_number or task.task_id} в архив?",
accept_text="В архив",
reject_text="Отмена",
)
if not answer:
return None
snapshot = self._application.archive_task(task.task_id)
if snapshot is None:
self._show_warning(parent, "Не удалось переместить задачу в архив.")
return snapshot
def refuse_task(
self,
task: TicketTaskSnapshot,
parent=None,
) -> TicketTaskSnapshot | None:
dialog = TaskRefusalDialog(task, parent=parent)
if dialog.exec() != dialog.DialogCode.Accepted:
return None
refusal_reason = dialog.refusal_reason
if not refusal_reason:
self._show_warning(parent, "Причина отказа не указана.")
return None
snapshot = self._application.refuse_task(task.task_id, refusal_reason)
if snapshot is None:
self._show_warning(parent, "Не удалось перевести задачу в отказ.")
return snapshot
@staticmethod
def _show_warning(parent, text: str) -> None:
TicketMessageDialog.show_warning(parent, "Ticket", text)