Тексты лицензии: поддержка (обновления) вместо «договора»; по окончании поддержки всё работает без новых версий

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014FsEKyJrYF69Cj9ZXzFLRi
This commit is contained in:
zuevav
2026-09-24 22:53:16 +03:00
parent e5176d6df2
commit a2d9d9c0f4
4 changed files with 18 additions and 7 deletions
+5 -1
View File
@@ -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") + " (офлайн-ключ)"
+1 -1
View File
@@ -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
}
+11 -4
View File
@@ -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. смена версии внешней системы при закрытых обновлениях ----
+1 -1
View File
@@ -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)
}
// Онлайн без договора и продление идёт — предупреждать не о чем.