DEPO: ошибка в карточке перевода снимается, когда запись после возврата в очередь прошла

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q7eREaYwUt1i4fNLZcGnjn
This commit is contained in:
fontvielle
2026-10-22 17:53:28 +03:00
parent 188691557a
commit 56a5a50174
3 changed files with 15 additions and 4 deletions
+11
View File
@@ -44,6 +44,10 @@ type DepoLink struct {
DocState string `json:"doc_state,omitempty"` // состояние документа в DEPO (OD_DOCS.STATE → название)
DocStateAt time.Time `json:"doc_state_at,omitempty"`
Errors []string `json:"errors,omitempty"` // DEPO_ERROR
// FixedErr/FixedAt — последняя ошибка, после которой запись прошла (вернули в очередь): в карточке —
// серой строкой вместо красной плашки.
FixedErr string `json:"fixed_err,omitempty"`
FixedAt time.Time `json:"fixed_at,omitempty"`
LastEvent string `json:"last_event,omitempty"`
UpdatedAt time.Time `json:"updated_at"`
}
@@ -540,6 +544,13 @@ func depoPollOrders(ctx context.Context, db *sql.DB, rc *RuntimeConfig) {
globalDepoLinks.update(guid, func(x *DepoLink) { x.DocNo, x.DocAt, x.LastEvent = doc, time.Now(), "FTV_M2M.DOC" })
log.Printf("depo-events: DEPO создала поручение по %s: %s", shortGUID(guid), doc)
}
// запись прошла после ошибки (депозитарий вернул её в очередь) — ошибка устранена
if state == "SUCCESS" && lineErr == "" && l != nil && len(l.Errors) > 0 {
globalDepoLinks.update(guid, func(x *DepoLink) {
x.FixedErr, x.FixedAt, x.Errors = x.Errors[len(x.Errors)-1], time.Now(), nil
})
log.Printf("depo-events: перевод %s обработан в DEPO после ошибки — ошибка снята", shortGUID(guid))
}
if state == "ERROR" || lineErr != "" {
msg := strings.TrimSpace(comment + " " + lineErr)
if l == nil || len(l.Errors) == 0 || !strings.HasSuffix(l.Errors[len(l.Errors)-1], msg) {
@@ -142,7 +142,7 @@
Поэтому в НРД по заявке <b>ничего не отправлялось</b>: регистрация и блокировка в QUIK МНП идут <u>до</u> отправки пакета в НРД.<br>
<span class="muted" style="color:inherit;opacity:.85">Ответ модуля QUIK: <code>{{.QuikFailReply}}</code></span>
</div>{{end}}
{{if .DepoL}}<div style="margin:8px 0 0;padding:8px 12px;border-radius:9px;font-size:13px;{{if .DepoL.Errors}}background:color-mix(in srgb,#dc2626 12%,var(--card));color:#b3261e{{else}}background:var(--card-2){{end}}">🗂 DEPO (bj2depo): {{if .DepoL.DocNo}}поручение <b>№{{.DepoL.DocNo}}</b> создано {{msk .DepoL.DocAt}}{{if .DepoL.DocState}} · состояние в DEPO: <b>{{.DepoL.DocState}}</b>{{end}}{{else}}поручение ещё не создано{{end}}{{range .DepoL.Errors}}<div>ошибка: {{.}}</div>{{end}}</div>{{end}}
{{if .DepoL}}<div style="margin:8px 0 0;padding:8px 12px;border-radius:9px;font-size:13px;{{if .DepoL.Errors}}background:color-mix(in srgb,#dc2626 12%,var(--card));color:#b3261e{{else}}background:var(--card-2){{end}}">🗂 DEPO (bj2depo): {{if .DepoL.DocNo}}поручение <b>№{{.DepoL.DocNo}}</b> создано {{msk .DepoL.DocAt}}{{if .DepoL.DocState}} · состояние в DEPO: <b>{{.DepoL.DocState}}</b>{{end}}{{else}}поручение ещё не создано{{end}}{{range .DepoL.Errors}}<div>ошибка: {{.}}</div>{{end}}{{if and .DepoL.FixedErr (not .DepoL.Errors)}}<div class="muted" style="font-size:12px">была ошибка: {{.DepoL.FixedErr}} — после возврата в очередь обработано {{msk .DepoL.FixedAt}}</div>{{end}}</div>{{end}}
<p class="muted" style="font-size:12.5px;margin:6px 0 0">При отправке в НРД bj регистрирует в Модуле неторговых поручений «Вывод ЦБ (M2M)» — QUIK блокирует бумаги на позиции клиента. Отказ контрагента или НРД → поручение снимается с причиной (клиент видит её в терминале). Приём НРД нашего поручения 16 → подпись депозитария, бумаги списываются.</p>
{{if not .Quik}}<p class="muted" style="margin-top:10px">Поручений МНП по этой заявке нет{{if .Claim.M2MGUID}} — можно зарегистрировать вручную:
@@ -381,7 +381,7 @@
<h2 style="margin:0">QUIK МНП — зачисление бумаг клиенту</h2>
<a href="/admin/quik" class="muted" style="font-size:12px">все поручения →</a>
</div>
{{if .DepoL}}<div style="margin:8px 0 0;padding:8px 12px;border-radius:9px;font-size:13px;{{if .DepoL.Errors}}background:color-mix(in srgb,#dc2626 12%,var(--card));color:#b3261e{{else}}background:var(--card-2){{end}}">🗂 DEPO (bj2depo): {{if .DepoL.DocNo}}поручение <b>№{{.DepoL.DocNo}}</b> создано {{msk .DepoL.DocAt}}{{if .DepoL.DocState}} · состояние в DEPO: <b>{{.DepoL.DocState}}</b>{{end}}{{else}}поручение ещё не создано{{end}}{{range .DepoL.Errors}}<div>ошибка: {{.}}</div>{{end}}</div>{{end}}
{{if .DepoL}}<div style="margin:8px 0 0;padding:8px 12px;border-radius:9px;font-size:13px;{{if .DepoL.Errors}}background:color-mix(in srgb,#dc2626 12%,var(--card));color:#b3261e{{else}}background:var(--card-2){{end}}">🗂 DEPO (bj2depo): {{if .DepoL.DocNo}}поручение <b>№{{.DepoL.DocNo}}</b> создано {{msk .DepoL.DocAt}}{{if .DepoL.DocState}} · состояние в DEPO: <b>{{.DepoL.DocState}}</b>{{end}}{{else}}поручение ещё не создано{{end}}{{range .DepoL.Errors}}<div>ошибка: {{.}}</div>{{end}}{{if and .DepoL.FixedErr (not .DepoL.Errors)}}<div class="muted" style="font-size:12px">была ошибка: {{.DepoL.FixedErr}} — после возврата в очередь обработано {{msk .DepoL.FixedAt}}</div>{{end}}</div>{{end}}
{{if .Rejected}}
<p class="muted" style="font-size:12.5px;margin:10px 0 0">Зачисление в QUIK не требуется — перевод отклонён ({{.RejectCodes}}), бумаги клиенту не поступают.</p>
{{else}}