From a2d9d9c0f43ff09307f38e3815d9a4111c2bed25 Mon Sep 17 00:00:00 2001 From: zuevav Date: Thu, 24 Sep 2026 22:53:16 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A2=D0=B5=D0=BA=D1=81=D1=82=D1=8B=20=D0=BB?= =?UTF-8?q?=D0=B8=D1=86=D0=B5=D0=BD=D0=B7=D0=B8=D0=B8:=20=D0=BF=D0=BE?= =?UTF-8?q?=D0=B4=D0=B4=D0=B5=D1=80=D0=B6=D0=BA=D0=B0=20(=D0=BE=D0=B1?= =?UTF-8?q?=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F)=20=D0=B2?= =?UTF-8?q?=D0=BC=D0=B5=D1=81=D1=82=D0=BE=20=C2=AB=D0=B4=D0=BE=D0=B3=D0=BE?= =?UTF-8?q?=D0=B2=D0=BE=D1=80=D0=B0=C2=BB;=20=D0=BF=D0=BE=20=D0=BE=D0=BA?= =?UTF-8?q?=D0=BE=D0=BD=D1=87=D0=B0=D0=BD=D0=B8=D0=B8=20=D0=BF=D0=BE=D0=B4?= =?UTF-8?q?=D0=B4=D0=B5=D1=80=D0=B6=D0=BA=D0=B8=20=D0=B2=D1=81=D1=91=20?= =?UTF-8?q?=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=B0=D0=B5=D1=82=20=D0=B1=D0=B5?= =?UTF-8?q?=D0=B7=20=D0=BD=D0=BE=D0=B2=D1=8B=D1=85=20=D0=B2=D0=B5=D1=80?= =?UTF-8?q?=D1=81=D0=B8=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_014FsEKyJrYF69Cj9ZXzFLRi --- internal/lkgateway/licensecheck.go | 6 +++++- internal/lkgateway/licenseclient.go | 2 +- internal/lkgateway/licensewarn.go | 15 +++++++++++---- internal/lkgateway/licensewarn_test.go | 2 +- 4 files changed, 18 insertions(+), 7 deletions(-) diff --git a/internal/lkgateway/licensecheck.go b/internal/lkgateway/licensecheck.go index 94c1383..1152264 100644 --- a/internal/lkgateway/licensecheck.go +++ b/internal/lkgateway/licensecheck.go @@ -164,7 +164,11 @@ func licenseStatus(rc *RuntimeConfig) LicenseStatus { if st.Online { st.Message = "активна до " + lic.ExpiresAt.Format("02.01.2006") + ", продлевается автоматически" if !lic.ContractUntil.IsZero() { - st.Message += "; договор до " + lic.ContractUntil.Format("02.01.2006") + if time.Now().After(lic.ContractUntil) { + st.Message += "; поддержка закончилась " + lic.ContractUntil.Format("02.01.2006") + " — работает без новых версий" + } else { + st.Message += "; поддержка (обновления) до " + lic.ContractUntil.Format("02.01.2006") + } } } else { st.Message = "активна до " + lic.ExpiresAt.Format("02.01.2006") + " (офлайн-ключ)" diff --git a/internal/lkgateway/licenseclient.go b/internal/lkgateway/licenseclient.go index cea0b81..dee3424 100644 --- a/internal/lkgateway/licenseclient.go +++ b/internal/lkgateway/licenseclient.go @@ -164,7 +164,7 @@ func LicenseRenew(ctx context.Context, rc *RuntimeConfig) error { if errors.As(err, &ae) && time.Since(licenseAlertAt) > 12*time.Hour { licenseAlertAt = time.Now() raiseSystemAlert(rc, "Лицензия: сервер лицензий отказал в продлении", - fmt.Sprintf("%s (%s). Текущий ключ действует до %s; после этого модули по лицензии отключатся.", ae.Message, ae.Code, lic.ExpiresAt.Local().Format("02.01.2006"))) + fmt.Sprintf("%s (%s). Текущий ключ действует до %s; если его не продлить, модули по лицензии отключатся — обратитесь в ZETIT.", ae.Message, ae.Code, lic.ExpiresAt.Local().Format("02.01.2006"))) } return err } diff --git a/internal/lkgateway/licensewarn.go b/internal/lkgateway/licensewarn.go index 1823b6c..780ebe3 100644 --- a/internal/lkgateway/licensewarn.go +++ b/internal/lkgateway/licensewarn.go @@ -75,7 +75,7 @@ func licenseEnd(st LicenseStatus, lastSync, now time.Time) (end time.Time, what return time.Time{}, "" // уже не действует — об этом говорит статус и отказ в продлении } if !st.ContractUntil.IsZero() { - end, what = st.ContractUntil, "договор" + end, what = st.ContractUntil, "поддержка" } renewStuck := st.Online && now.Sub(lastSync) > 48*time.Hour if (!st.Online || renewStuck) && !st.ExpiresAt.IsZero() && (end.IsZero() || st.ExpiresAt.Before(end)) { @@ -149,10 +149,17 @@ func licenseExpiryWarn(rc *RuntimeConfig, now time.Time) { if daysLeft == 0 { left = "сегодня последний день" } + if what == "поддержка" { + // лицензия бессрочная: по окончании поддержки всё работает, закрываются только новые версии + raiseSystemAlert(rc, "Поддержка bj заканчивается через "+ruDays(daysLeft), + fmt.Sprintf("Поддержка (обновления) bj действует до %s — %s. После этого bj и все купленные модули продолжат работать, "+ + "переустановка останется доступной, но только на версиях, вышедших до этой даты. Новые версии bj (под новые версии МНП, ИШ НРД и других систем) "+ + "станут доступны после продления поддержки — обратитесь в ZETIT.", end.Local().Format("02.01.2006"), left)) + return + } raiseSystemAlert(rc, "Лицензия: "+strings.SplitN(what, " ", 2)[0]+" заканчивается через "+ruDays(daysLeft), - fmt.Sprintf("Лицензия bj (%s) действует до %s — %s. После этого переводы M2M, обмен с НРД и DEPO, цикл QUIK МНП и личный кабинет продолжат работать, "+ - "но отключатся модули по лицензии и обновления bj: новые версии МНП, ИШ и других систем со временем могут перестать корректно работать с bj. "+ - "Для продления обратитесь к поставщику bj.", what, end.Local().Format("02.01.2006"), left)) + fmt.Sprintf("Ключ лицензии bj (%s) действует до %s — %s. bj продлевает его автоматически через сервер лицензий; если продления не будет, "+ + "модули по лицензии и обновления отключатся. Проверьте связь с lic.zetit.ru или обратитесь в ZETIT.", what, end.Local().Format("02.01.2006"), left)) } // ---- 2. смена версии внешней системы при закрытых обновлениях ---- diff --git a/internal/lkgateway/licensewarn_test.go b/internal/lkgateway/licensewarn_test.go index 380f9e7..03de333 100644 --- a/internal/lkgateway/licensewarn_test.go +++ b/internal/lkgateway/licensewarn_test.go @@ -13,7 +13,7 @@ func TestLicenseEnd(t *testing.T) { // Онлайн-ключ продлевается — важна дата договора. st := LicenseStatus{Valid: true, Online: true, ContractUntil: contract, ExpiresAt: key} - if end, what := licenseEnd(st, now.Add(-time.Hour), now); !end.Equal(contract) || what != "договор" { + if end, what := licenseEnd(st, now.Add(-time.Hour), now); !end.Equal(contract) || what != "поддержка" { t.Fatalf("онлайн с договором: %v %q", end, what) } // Онлайн без договора и продление идёт — предупреждать не о чем.