51 lines
2.0 KiB
Python
51 lines
2.0 KiB
Python
# -*- coding: utf-8 -*-
|
|
# hub/ticket/application/report_signing_service.py
|
|
|
|
"""Application-сервис подписания отчётов Ticket."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from domain.task import TicketTask
|
|
from domain.ticket_constants import STATE_CONFIRMATION
|
|
from state import TicketStateApi
|
|
|
|
|
|
class ReportSigningService:
|
|
"""Команды подписания отчётов поверх канонического state API."""
|
|
|
|
def __init__(self, state: TicketStateApi):
|
|
self._state = state
|
|
|
|
def sign_report(self, task_id: int, report_type: str):
|
|
"""Подписать диагностический или ремонтный отчёт."""
|
|
snapshot = self._state.get_task(task_id)
|
|
if snapshot is None:
|
|
return None
|
|
if report_type not in {"diagnostic", "repair"}:
|
|
return None
|
|
self._state.sign_report(task_id, report_type)
|
|
return self._state.get_task(task_id)
|
|
|
|
def sign_acceptance_report(self, task_id: int):
|
|
"""Подписать акт приёмки без смены доменного состояния."""
|
|
snapshot = self._state.get_task(task_id)
|
|
if snapshot is None:
|
|
return None
|
|
task_data = TicketTask.from_snapshot(snapshot).to_record()
|
|
task_data["acceptance_report_signed"] = True
|
|
return self._state.update_task(task_data)
|
|
|
|
def can_advance_to_confirmation(self, task_id: int) -> bool:
|
|
"""Проверить готовность задачи к переходу в подтверждение."""
|
|
return self._state.can_advance_to_confirmation(task_id)
|
|
|
|
def can_advance_to_completed(self, task_id: int) -> bool:
|
|
"""Проверить готовность задачи к переходу в выполненные."""
|
|
snapshot = self._state.get_task(task_id)
|
|
if snapshot is None:
|
|
return False
|
|
return (
|
|
snapshot.state_code == STATE_CONFIRMATION
|
|
and snapshot.acceptance_report_signed
|
|
)
|