Files
Bridge-and-Join-s/internal/lkgateway/web/templates/admin_fancy_queue.html
T
zuevav da12a9ec1c feat(bj): модуль ЛК на PostgreSQL, обмен с DEPO, боевой ЛК с имитатором НРД, QUIK, НПР
- bj_exchange и «кран» Fancy убраны: данные модуля ЛК в PostgreSQL (схема lk)
- трансферные таблицы FTV_M2M: создание при установке, события, справочник участников
- сверка с DEPO: счёт, ФИО, дата рождения, ИИС по договору, квал-инвестор из опции DEPO
- боевой ЛК ЕСИА Финанс при тестовом ИШ: журнал, отказ через DEPO, статусы в ЛК
- онлайн-лицензирование в bj, план тестирования M2M для контрагента (интерактивный HTML)
- модули QUIK МНП, экспорт QUIK, НПР/УДС; документы и тестовые материалы

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-15 19:41:12 +03:00

77 lines
7.4 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{{define "content"}}
<div class="hero">
<h1 class="hero-greeting">Обмен с DEPO (Fancy)</h1>
<span class="hero-status">Переводы M2M, которые bj передал в депозитарную систему через трансферные таблицы базы {{.DB}} (FTV_M2M / FTV_M2M_LINES / FTV_M2M_EVENTS). Job bj2depo создаёт по ним документы в DEPO и отвечает событиями; bj ведёт статусы, документ и ошибки.</span>
</div>
{{if .Flash}}<div class="card" style="background:var(--accent-weak)">{{.Flash}}</div>{{end}}
<div class="card">
<h2>Как идёт обмен</h2>
<p class="muted" style="line-height:1.7">
<span class="badge awaiting_decision">FTV_M2M</span> bj записывает перевод (шапка + строки по бумагам) и событие <code>BJ_*</code> со STATE=<b>TODO</b> →
<span class="badge awaiting_decision">bj2depo</span> процедура FTV_M2M_JOB ({{.JobMode}}) читает события, создаёт документ 16/16-1 в DEPO, отвечает <code>DEPO_ORDER_CREATED</code> (номер документа) или <code>DEPO_ERROR</code> →
<span class="badge sent">документ</span> bj следит за состоянием документа (OD_DOCS: начальный ввод → конец обработки / отмена) и при отмене оповещает →
<span class="badge confirmed">события НРД</span> по ответам MS010 и M2M bj дописывает <code>BJ_ORDER_ACCEPTED / BJ_EXECUTED / BJ_REJECTED / BJ_CANCELLED</code>.
Опрос таблиц — раз в минуту. Подробности и словарь событий — <a href="/admin/help/fancy-events">страница для программиста Fancy</a>.
</p>
<div style="display:flex;gap:18px;flex-wrap:wrap;font-size:13px;margin-top:6px">
<span>Переводов: <b>{{.Sum.Total}}</b></span>
<span>Ждут job: <b>{{.Sum.Pending}}</b></span>
<span>С документом DEPO: <b>{{.Sum.WithDoc}}</b></span>
<span>С ошибками: <b style="{{if .Sum.Errors}}color:var(--err){{end}}">{{.Sum.Errors}}</b></span>
{{if not .Sum.LastEventAt.IsZero}}<span>Последнее событие: <b>{{wall .Sum.LastEventAt}}</b></span>{{end}}
<span>Справочник НРД в DEPO: {{if .Sum.HasHandbook}}<b>{{.Sum.Handbook}}</b> участников{{if not .Sum.HandbookAt.IsZero}} (обновлён {{wall .Sum.HandbookAt}}){{end}}{{else}}<span class="muted">таблица FTV_M2M_HANDBOOK не создана</span>{{end}}</span>
<span>Job bj2depo: {{.JobMode}}{{if eq .Fancy.DepoJobMode "bj"}}{{if .Fancy.DepoJobLast}} · последний вызов: {{.Fancy.DepoJobLast}}{{if not .Fancy.DepoJobLastAt.IsZero}} ({{msk .Fancy.DepoJobLastAt}}){{end}}{{end}}{{else if .Fancy.DepoJobCheck}} · проверка готовности: {{if .Fancy.DepoJobCheckOK}}OK{{else}}не пройдена{{end}}{{if not .Fancy.DepoJobCheckAt.IsZero}} ({{msk .Fancy.DepoJobCheckAt}}){{end}}{{end}} · <a href="/admin/setup#fancy">настройки</a></span>
</div>
</div>
{{if or .Failures (not .RunAsOK)}}<div class="card" style="border:1px solid var(--err)">
<h2 style="color:var(--err)">Обработчик DEPO не смог обработать записи{{if .Failures}} ({{len .Failures}}){{end}}</h2>
<p class="muted">Пока причина не устранена, документы в DEPO не создаются, а статусы по заявкам ЛК не ставятся. Устраните причину по тексту ошибки и верните записи в очередь: обработчик возьмёт их заново.</p>
{{if not .RunAsOK}}<p style="color:var(--err)">✗ {{.RunAsMsg}}</p>{{end}}
{{if .Failures}}
<div style="overflow-x:auto"><table style="margin-top:8px">
<thead><tr><th>Запись</th><th>Перевод</th><th>Тип / строка</th><th>Когда</th><th>Ошибка обработчика</th></tr></thead>
<tbody>{{range .Failures}}<tr>
<td>{{.TableRu}} №{{.ID}}</td><td><code>{{.GUID}}</code></td><td>{{.Type}}{{if .Ref}}<div class="muted" style="font-size:11px">{{.Ref}}</div>{{end}}</td>
<td style="white-space:nowrap">{{if not .At.IsZero}}{{wall .At}}{{end}}</td><td style="color:var(--err);font-size:12px">{{.Comment}}</td>
</tr>{{end}}</tbody>
</table></div>
<form method="post" action="/admin/fancy-queue/requeue" style="margin-top:12px"><button type="submit" class="btn btn-ok" onclick="return confirm('Вернуть записи с ошибкой в очередь обработчика DEPO?')">↻ Вернуть в очередь</button></form>
{{end}}
</div>{{end}}
<div class="card">
<h2>Переводы в DEPO ({{len .Rows}})</h2>
{{if .Error}}<p style="color:var(--err)">{{.Error}}</p>{{end}}
{{if .Rows}}
<div style="overflow-x:auto">
<table style="font-size:12.5px">
<thead><tr><th>Создан</th><th>Перевод</th><th>Направление</th><th>Депонент</th><th>Контрагент</th><th>Бумаги</th><th>Документ DEPO</th><th>Состояние</th></tr></thead>
<tbody>
{{range .Rows}}
<tr>
<td style="white-space:nowrap">{{if not .CreatedAt.IsZero}}{{wall .CreatedAt}}{{else}}—{{end}}</td>
<td><a href="/admin/claims?guid={{.GUID}}"><code>{{short 8 .GUID}}</code></a>{{if .Comment}}<div class="muted" style="font-size:11px">{{.Comment}}</div>{{end}}</td>
<td style="white-space:nowrap">{{.DirectionRu}}</td>
<td>{{.Deponent}}{{if .DeponentDoc}}<div class="muted" style="font-size:11px">{{.DeponentDoc}}</div>{{end}}</td>
<td><code>{{.CP}}</code></td>
<td>{{range .Lines}}<div><code>{{.ISIN}}</code>{{if .SecCode}} <span class="muted">{{.SecCode}}</span>{{end}} × {{.Amount}}{{if eq .State "ERROR"}} <span class="badge rejected">ошибка</span>{{end}}</div>{{else}}<span class="muted">—</span>{{end}}</td>
<td>{{if .Doc}}<b>№{{.Doc}}</b><div class="muted" style="font-size:11px">{{.DocState}}{{if not .DocAt.IsZero}} · {{wall .DocAt}}{{end}}</div>{{else}}<span class="muted">не создан</span>{{end}}</td>
<td><span class="badge {{stageCls .}}">{{stageText .}}</span>
{{range .Errors}}<div style="color:var(--err);font-size:11px">{{.}}</div>{{end}}</td>
</tr>
<tr><td colspan="8" style="padding:2px 10px 8px 24px;border-top:none"><div class="muted" style="font-size:11px;display:flex;gap:6px 18px;flex-wrap:wrap">{{range .Events}}<span><span style="{{if eq .State "TODO"}}color:var(--warn);font-weight:600{{end}}">{{.Type}}</span>{{if .Ref}} <code>{{.Ref}}</code>{{end}} · {{wall .At}}{{if .Codes}} · {{.Codes}}{{end}}{{if .Comment}} — {{.Comment}}{{end}}</span>{{else}}<span>событий нет</span>{{end}}</div></td></tr>
{{end}}
</tbody>
</table>
</div>
{{else if not .Error}}
<p class="muted">В трансферных таблицах пока нет переводов. Они появятся при входящем/исходящем переводе M2M или при прогоне «Тестирование M2M → выгрузка истории в DEPO».</p>
{{end}}
</div>
<p style="margin-top:14px"><a href="/admin/help/fancy-events" class="muted">bj ↔ bj2depo: события, таблицы, действия job →</a></p>
{{end}}