Документы НРД по поручению: папки с понятными названиями, опись и PDF

Пакеты НРД из INBOX ИШ (K…, 508…) распознаются по содержимому: квитанция о регистрации (или отказ),
уведомление GS036, отчёт о статусе GS116 (сквитовано / не сквитовано), отчёт об исполнении MS010,
ошибка. В ZIP ответа НРД и выгрузках для регулятора (16 и 16/1) — папки «01 Квитанция о регистрации
поручения — K1699092» и т. д., «Опись.txt» с назначением и реквизитами каждого документа и
«Документы НРД.pdf» (читаемое представление, печать через Chromium; без него — HTML). В карточке
перевода ответы НРД подписаны так же.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
zuevav
2026-09-16 16:26:25 +03:00
parent 6a2e9b7122
commit 28c0ed7349
8 changed files with 451 additions and 28 deletions
+6 -9
View File
@@ -139,8 +139,8 @@ func submitIncomingOrderFor(ctx context.Context, deps incomingDeps, it *Incoming
// writeOrderResponseZip отдаёт на скачивание ZIP с сырыми файлами ответа НРД
// (отчёт MS010 + квитанции) по поручению с данным contr_d_id.
func writeOrderResponseZip(w http.ResponseWriter, contrDID, fname string) {
files := collectOrderResponseRaw(contrDID)
if len(files) == 0 {
docs := nsdOrderDocs(contrDID)
if len(docs) == 0 {
http.Error(w, "ответ НРД (MS010) по этому поручению в INBOX ИШ ещё не найден", http.StatusNotFound)
return
}
@@ -148,11 +148,7 @@ func writeOrderResponseZip(w http.ResponseWriter, contrDID, fname string) {
w.Header().Set("Content-Disposition", fmt.Sprintf(`attachment; filename="%s.zip"`, fname))
zw := zip.NewWriter(w)
defer zw.Close()
for _, f := range files {
if wf, e := zw.Create(f.Name); e == nil {
_, _ = wf.Write(f.Data)
}
}
writeNSDDocsZip(zw, "", "Документы НРД по поручению № "+contrDID, docs, true)
}
// downloadSentOrder отдаёт на скачивание XML отправленного поручения 16/1
@@ -360,8 +356,9 @@ func orderRespKind(pkg, body string) (string, bool) {
u := strings.ToUpper(body)
low := strings.ToLower(body)
switch {
case strings.Contains(u, "MS010") || strings.Contains(u, "SESE.025"):
return "Отчёт по поручению депо MS010 — операция проведена, бумаги зачислены", true
case strings.Contains(u, "MS010") || strings.Contains(u, "SESE.025") || strings.Contains(u, "SESE.024") || strings.Contains(u, "GS036") || strings.Contains(u, "GS116") || strings.Contains(low, "<reg_no>"):
d := classifyNSDDoc(pkg, body)
return d.Title + " — " + d.About, d.Done
case strings.Contains(u, "ERROR") || strings.Contains(strings.ToUpper(pkg), "ERROR") || strings.Contains(low, "ошибк"):
return "Ошибка обработки пакета (CERROR)", false
case strings.Contains(u, "REORD") || strings.Contains(low, "принят"):