package lkgateway import ( "strings" "testing" "time" ) // GS036 «об отсутствии встречного поручения» связывается с поручением по референсу строки. func TestNoCounterNotice(t *testing.T) { at := time.Date(2026, 9, 28, 17, 50, 2, 0, time.Local) pkgIndexCache.mu.Lock() old, oldAt := pkgIndexCache.list, pkgIndexCache.at pkgIndexCache.list = []pkgIndexEntry{ {dir: "Z2895760", mt: at, body: "GS036 отсутствии встречного поручения к поручению депоРеференсM2M20260928HEKR0"}, {dir: "K2895751", mt: at, body: "1446389121952"}, } pkgIndexCache.at = time.Now().Add(time.Hour) pkgIndexCache.mu.Unlock() defer func() { pkgIndexCache.mu.Lock() pkgIndexCache.list, pkgIndexCache.at = old, oldAt pkgIndexCache.mu.Unlock() }() if got, ok := findNoCounterNotice("M2M20260928HEKR0"); !ok || !got.Equal(at) { t.Fatalf("уведомление не найдено: %v %v", got, ok) } if _, ok := findNoCounterNotice("M2M20260928M5XQC"); ok { t.Fatal("чужой референс") } w := &OrderWatch{Direction: "out", OrderAt: at.Add(-time.Minute), LateAt: at.Add(5 * time.Minute), NoCounterAt: at} if s := w.StatusRu(); !strings.Contains(s, "контрагент ещё не подал встречное поручение 16/1") { t.Fatalf("ждём встречное: %q", s) } w.Direction = "in" if s := w.StatusRu(); !strings.Contains(s, "поручение 16 передающего") { t.Fatalf("входящий: %q", s) } w.Direction, w.MS010At = "out", at.Add(53*time.Minute) if s := w.StatusRu(); !strings.Contains(s, "исполнено") || !strings.Contains(s, "подано не сразу") { t.Fatalf("исполнено, встречное не сразу: %q", s) } // сквитовано через минуту, исполнение НРД через 52 мин — задержка у НРД, не у контрагента w.MatchedAt = at.Add(time.Minute) if s := w.StatusRu(); strings.Contains(s, "не сразу") || !strings.Contains(s, "сквитовано со встречным в 17:51, исполнение НРД — через 52 мин") { t.Fatalf("исполнено после сквитовки: %q", s) } w.MS010At = time.Time{} if s := w.StatusRu(); !strings.Contains(s, "сквитовано со встречным") || !strings.Contains(s, "ждём исполнения НРД") { t.Fatalf("сквитовано, ждём: %q", s) } } // Номер ответа НРД для PARAMETERS — из отчёта MS010 (BizMsgIdr), не из промежуточных документов. func TestOrderRespNo(t *testing.T) { resps := []orderResponse{{Kind: "GS036", No: "50878765"}, {Kind: "MS010", Done: true, No: "50878767"}} if got := orderRespNo(resps); got != "50878767" { t.Fatalf("номер ответа: %q", got) } if got := orderRespNo(resps[:1]); got != "" { t.Fatalf("без MS010 — пусто: %q", got) } } func TestNSDRespNoDate(t *testing.T) { body := "50878767sese.025.001.10MS0102026-09-29T12:43:28Z" if got := nsdRespNoDate(body); got != "50878767 от 29.09.2026" { t.Fatalf("%q", got) } if got := nsdRespNoDate("2026-09-29T21:30:00Z1"); got != "1 от 30.09.2026" { t.Fatalf("дата по МСК: %q", got) } }