package lkgateway // incoming_draft.go — скачивание черновика поручения 16/1 (MF010), который НРД // сформировал по нашему согласию на прием. Черновик передаётся в депозитарную // учётную систему (Fancy-DEPO), чтобы та подала поручение 16/1 в НРД (перевод // бумаг между счетами номинального держателя) — тогда НРД проведёт зачисление и // выпустит отчёт MS010. Здесь мы просто отдаём файл(ы) черновика на скачивание. import ( "archive/zip" "fmt" "net/http" "os" "path/filepath" "strings" ) // findMF010Files ищет все файлы черновика MF010 (xml + подпись .SGN), // сформированные НРД по данному переводу (по GUID в based_on). func findMF010Files(guid string) []string { guidLower := strings.ToLower(strings.TrimSpace(guid)) var xmls, dirs []string seen := map[string]bool{} _ = filepath.Walk(igwInboxDir, func(p string, info os.FileInfo, err error) error { if err != nil || info.IsDir() { return nil } if !strings.HasSuffix(strings.ToUpper(p), "_MF010.XML") { return nil } b, e := os.ReadFile(p) if e != nil || !strings.Contains(strings.ToLower(string(b)), guidLower) { return nil } xmls = append(xmls, p) if d := filepath.Dir(p); !seen[d] { seen[d] = true dirs = append(dirs, d) } return nil }) // добавляем .SGN рядом с каждым xml out := append([]string{}, xmls...) for _, x := range xmls { sgn := strings.TrimSuffix(x, filepath.Ext(x)) + ".SGN" if _, e := os.Stat(sgn); e == nil { out = append(out, sgn) } } return out } const igwInboxDir = "/var/lib/igate/exchange/INBOX" // downloadIncomingDraft отдаёт ZIP с черновиком(ами) поручения 16/1 (MF010) по // переводу — для загрузки в депозитарную учётную систему. func downloadIncomingDraft(w http.ResponseWriter, r *http.Request, deps incomingDeps, id string) { it, ok := deps.store.Get(id) if !ok { http.Error(w, "входящий перевод не найден", http.StatusNotFound) return } files := findMF010Files(it.GUID) if len(files) == 0 { http.Error(w, "черновик поручения 16/1 (MF010) по этому переводу в INBOX ИШ не найден", http.StatusNotFound) return } w.Header().Set("Content-Type", "application/zip") w.Header().Set("Content-Disposition", fmt.Sprintf(`attachment; filename="poruchenie-16-1-%s.zip"`, shortID(it.ID))) zw := zip.NewWriter(w) defer zw.Close() for _, p := range files { b, e := os.ReadFile(p) if e != nil { continue } if f, e := zw.Create(filepath.Base(p)); e == nil { _, _ = f.Write(b) } } }