Merge branch 'feat/dds-card-errors-wording'

lct-53: ДДС сообщает в 112 об ошибке карточки по докладу с места
This commit is contained in:
GGlamer 2026-09-27 23:45:32 +03:00 • committed by GitHub
commit 8361e38a5a
5 changed files with 13 additions and 7 deletions

View file

@ -3,9 +3,9 @@
Учебный исходящий звонок бригаде имитируется событиями JSON. Для целевого
локального прототипа не нужна внешняя телефония или аудиомодель.
Самая ценная механика цепочки — `card.bounce`: диспетчер видит, что не указан
этаж, и отбивает карточку обратно. Неполнота КИО перестаёт быть процентом
в отчёте и становится сорванным выездом с конкретной причиной.
`card.bounce` сервер отклоняет: ДДС не возвращает карточку в 112 при принятии
и не правит её поля. Об ошибке, которую вскрыл доклад бригады с места,
диспетчер сообщает в 112 по телефону (ответ заказчика, П.3).
Правила пульта — в `DdsDesk.apply`; здесь разбор команды и рассылка итога.
Отсев повторов и операция хранилища — в `run_command`.

View file

@ -591,8 +591,13 @@ class DdsDesk(BaseModel):
self.finish_work()
outcome.finished = True
case "card.bounce":
# Возврата карточки на этапе принятия нет; об ошибке, которую
# вскрыл доклад бригады с места, ДДС сообщает в 112 по телефону
# (ответ заказчика, П.3).
return _refused(
"ДДС не проверяет заполнение карточки: замечания передаёт служба контроля 112"
"Карточку не возвращают в 112 при принятии и не правят на АРМ ДДС. "
"Если ошибка вскрылась по докладу бригады с места — сообщите о ней "
"в 112 по телефону"
)
case "zone.decision":
previous = next(

View file

@ -175,7 +175,8 @@ def test_bounce_is_refused_in_favour_of_112_control():
outcome = state.desk.apply(CardBounce(missing_fields=["floor"]), state)
assert outcome.error == (
"ДДС не проверяет заполнение карточки: замечания передаёт служба контроля 112")
"Карточку не возвращают в 112 при принятии и не правят на АРМ ДДС. "
"Если ошибка вскрылась по докладу бригады с места — сообщите о ней в 112 по телефону")
def test_refusals_leave_desk_untouched():

View file

@ -123,7 +123,7 @@ def test_dds_cannot_return_card_for_112_quality_control(client):
station.send_json({"type": "card.bounce", "missing_fields": ["floor", "victims_count"],
"comment": "куда ехать без этажа"})
error = read_until(station, "error")
assert "служба контроля 112" in error["message"]
assert "сообщите о ней в 112 по телефону" in error["message"]
assert state.bounced_fields == []
trainee.send_json({"type": "call.hangup"})
wait_for(lambda: state.score is not None)

View file

@ -678,7 +678,7 @@ export function Dds() {
onClick={() => { channel.current?.send({ type: "zone.decision", in_zone: true }); }}>Наша</button>
<button type="button" disabled={zone !== null || !isConnected || ended}
onClick={() => { channel.current?.send({ type: "zone.decision", in_zone: false }); }}>Не наша</button></div>
<p className="dds-hint">ДДС не исправляет и не возвращает заполненную карточку: её качество контролируют оператор и служба контроля 112.</p>
<p className="dds-hint">Карточку не правят на АРМ ДДС и не возвращают в 112 при принятии. Если бригада с места доложит о расхождении с карточкой — сообщите об ошибке в 112 по телефону.</p>
<button type="button" className="dds-finish" disabled={!cardId || !isConnected || ended || advancePending}
onClick={() => {
if (reply.dirty && !send({ type: "card.reply", card_id: cardId, text: reply.text })) return;